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