Anda dapat memproyeksikan ke tipe anonim, dan kemudian dari itu ke tipe model
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 });
}
Sunting : Saya akan sedikit lebih spesifik karena pertanyaan ini mendapat banyak perhatian.
Anda tidak dapat memproyeksikan ke tipe model secara langsung (pembatasan EF), jadi tidak ada jalan lain untuk hal ini. Satu-satunya cara adalah memproyeksikan ke tipe anonim (iterasi 1), dan kemudian ke tipe model (iterasi ke-2).
Perlu diketahui juga bahwa ketika Anda memuat sebagian entitas dengan cara ini, mereka tidak dapat diperbarui, sehingga mereka harus tetap terpisah, sebagaimana adanya.
Saya tidak pernah benar-benar mengerti mengapa ini tidak mungkin, dan jawaban pada utas ini tidak memberikan alasan kuat untuk menolaknya (kebanyakan berbicara tentang data yang dimuat sebagian). Memang benar bahwa dalam entitas negara yang dimuat sebagian tidak dapat diperbarui, tetapi kemudian, entitas ini akan terlepas, sehingga upaya yang tidak disengaja untuk menyimpannya tidak mungkin dilakukan.
Pertimbangkan metode yang saya gunakan di atas: akibatnya kami masih memiliki entitas model yang dimuat sebagian. Entitas ini terpisah.
Pertimbangkan kode yang mungkin (ingin ada) ini:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Ini juga bisa menghasilkan daftar entitas yang terpisah, jadi kita tidak perlu membuat dua iterasi. Kompiler akan pintar untuk melihat bahwa AsNoTracking () telah digunakan, yang akan menghasilkan entitas yang terpisah, sehingga dapat memungkinkan kita untuk melakukan ini. Namun, jika AsNoTracking () dihilangkan, itu bisa melempar pengecualian yang sama seperti melempar sekarang, untuk memperingatkan kita bahwa kita perlu cukup spesifik tentang hasil yang kita inginkan.