Я пытаюсь что-то, что я не уверен, но я хочу спросить здесь, если это возможно.
Можно ли это сделать?
public IQueryable<Info> GetInfo(int count, byte languageId)
{
return db.Info.SelectMany(i => i.LanguageInfo)
.Where(l => l.Language.id == languageId)
.Select(l => new Info { AddDate = l.Info.AddDate,
Description = l.Description,
EntityKey = l.Info.EntityKey,
id = l.Info.id,
Title = l.Title,
ViewCount = l.Info.ViewCount }
)
.OrderByDescending(i => i.id)
.Take(count);
}
Когда этот метод выполняется, я получил сообщение об ошибке
Объект или сложный тип "GuideModel.Info" не может быть построенный в LINQ to Entities запрос.
Означает ли это "невозможно"?
Спасибо
Ошибка в основном указывает, что Entity Framework не знает, как создать объект Info, поскольку он не привязан к объекту таблицы. (Другими словами, вызов Select
в IQueryable
не может быть переведен в эквивалентный SQL.) Вы могли выполнить проекцию Select
на клиенте с помощью:
public IQueryable<Info> GetInfo(int count, byte languageId)
{
return db.Info.SelectMany(i => i.LanguageInfo)
.Where(l => l.Language.id == languageId)
.Take(count)
.AsEnumerable()
.Select(l => new Info { AddDate = l.Info.AddDate,
Description = l.Description,
EntityKey = l.Info.EntityKey,
id = l.Info.id,
Title = l.Title,
ViewCount = l.Info.ViewCount }
)
.OrderByDescending(i => i.id);
}
Можно использовать Select(l => new ...)
, но не с типом Entity. Вам нужно использовать анонимный тип или тип POCO без конструктора без параметров. Типы объектов являются "специальными" из-за того, как они взаимодействуют с ObjectContext. Вы можете выбрать их, но не добавить их в запрос.
Следующий код работал у меня. Здесь "SearchTerm" является сложным типом. Спасибо Джейсон:)
var lstSynonym = TechContext.TermSynonyms
.Where(p => p.Name.StartsWith(startLetter))
.AsEnumerable()
.Select(u => new SearchTerm
{
ContentId = u.ContentId,
Title = u.Name,
Url = u.Url
});