Сущность не может быть создана в запросе LINQ to Entities - PullRequest
357 голосов
/ 16 марта 2011

Существует тип сущности, называемый продуктом, который создается структурой сущности. Я написал этот запрос

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}

Приведенный ниже код вызывает следующую ошибку:

"Сущность или комплексный тип Shop.Продукт не может быть построен в Запрос LINQ to Entities "

var products = productRepository.GetProducts(1).Tolist();

Но когда я использую select p вместо select new Product { Name = p.Name};, он работает правильно.

Как мне предварительно сформировать секцию произвольного выбора?

Ответы [ 13 ]

0 голосов
/ 06 мая 2017

только добавить AsEnumerable ():

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products.AsEnumerable()
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}
0 голосов
/ 05 октября 2016

если вы выполняете Linq to Entity, вы не можете использовать ClassType с new в select закрытии запроса only anonymous types are allowed (new without type)

взгляните на этот фрагмент моего проекта

//...
var dbQuery = context.Set<Letter>()
                .Include(letter => letter.LetterStatus)
                .Select(l => new {Title =l.Title,ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated,LetterStatus = new {ID = l.LetterStatusID.Value,NameInArabic = l.LetterStatus.NameInArabic,NameInEnglish = l.LetterStatus.NameInEnglish} })
                               ^^ without type__________________________________________________________________________________________________________^^ without type

из вас добавили new keyword в закрытии Select даже на complex properties, вы получите эту ошибку

, поэтому remove ключевое слово ClassTypes from new на Linq to Entityзапросы ,,

, поскольку он будет преобразован в оператор sql и выполнен на SqlServer

, поэтому когда я смогу использовать new with types на select closure?

вы можете использовать его, если вы имеете дело с LINQ to Object (in memory collection)

//opecations in tempList , LINQ to Entities; so we can not use class types in select only anonymous types are allowed
var tempList = dbQuery.Skip(10).Take(10).ToList();// this is list of <anonymous type> so we have to convert it so list of <letter>

//opecations in list , LINQ to Object; so we can use class types in select
list = tempList.Select(l => new Letter{ Title = l.Title, ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated, LetterStatus = new LetterStatus{ ID = l.LetterStatus.ID, NameInArabic = l.LetterStatus.NameInArabic, NameInEnglish = l.LetterStatus.NameInEnglish } }).ToList();
                                ^^^^^^ with type 

после того, как я выполнил ToList по запросу, он стал in memory collection, поэтому мы можем использовать new ClassTypes в select

0 голосов
/ 25 августа 2016

Если вы используете Entity Framework, попробуйте удалить свойство из DbContext, которое использует вашу сложную модель в качестве Entity У меня была такая же проблема при отображении нескольких моделей в модель представления с именем Entity

public DbSet<Entity> Entities { get; set; }

Удаление записи из DbContext исправило мою ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...