Вы можете проецировать в анонимный тип, а затем из него в тип модели
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 () был опущен, он может выдать то же исключение, что и сейчас, чтобы предупредить нас о том, что нам нужно быть достаточно конкретными относительно результата, который мы хотим.