Вы можете проецировать в анонимный тип, а затем из него в тип модели
public IEnumerable<Product> GetProducts(int categoryID)
{
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new { Name = p.Name }).ToList()
.Select(x => new Product { Name = x.Name });
}
Редактировать : Я собираюсь быть более конкретным, так как этот вопрос привлек много внимания.
Вы не можете напрямую проецировать на тип модели (ограничение EF), поэтому нет никакого способа обойти это. Единственный способ - проецировать на анонимный тип (1-я итерация), а затем моделировать тип (2-я итерация).
Также имейте в виду, что когда вы частично загружаете объекты таким образом, они не могут быть обновлены, поэтому они должны оставаться отсоединенными, как они есть.
Я никогда полностью не понимал, почему это невозможно, и ответы в этой теме не дают веских оснований для этого (в основном речь идет о частично загруженных данных). Правильно, что в частично загруженном состоянии сущность не может быть обновлена, но тогда эта сущность будет отсоединена, поэтому случайные попытки сохранить их будут невозможны.
Рассмотрим метод, который я использовал выше: в результате у нас все еще есть частично загруженный объект модели. Эта сущность обособлена.
Считайте этот (желательный существующий) возможный код:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Это также может привести к списку отдельных объектов, поэтому нам не нужно делать две итерации. Компилятор был бы разумным, чтобы увидеть, что AsNoTracking () был использован, что приведет к отсоединению сущностей, так что это может позволить нам сделать это. Однако, если AsNoTracking () был опущен, он может выдать то же исключение, что и сейчас, чтобы предупредить нас о том, что нам нужно быть достаточно конкретными относительно результата, который мы хотим.