Ini mungkin pertanyaan yang sangat sederhana tapi apa cara yang bagus untuk memasukkan banyak entitas anak saat menulis kueri yang mencakup TIGA level (atau lebih)?
yaitu saya memiliki 4 tabel: Company
, Employee
, Employee_Car
danEmployee_Country
Perusahaan memiliki hubungan 1: m dengan Karyawan.
Karyawan memiliki hubungan 1: m dengan Employee_Car dan Employee_Country.
Jika saya ingin menulis kueri yang mengembalikan data dari semua 4 tabel, saat ini saya menulis:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Pasti ada cara yang lebih elegan! Ini bertele-tele dan menghasilkan SQL menghebohkan
Saya menggunakan EF4 dengan VS 2010
linq
entity-framework
lazy-loading
Nathan Liu
sumber
sumber
//inside public static class Extensions public static IQueryable<Company> CompleteCompanies(this DbSet<Company> table){ return table .Include("Employee.Employee_Car") .Include("Employee.Employee_Country") ; } //code will be... Company company = context.Companies.CompleteCompanies().FirstOrDefault(c => c.Id == companyID); //same for next advanced method
EF 4.1 hingga EF 6
Ada yang sangat diketik
.Include
yang memungkinkan kedalaman pemuatan yang diinginkan untuk ditentukan dengan memberikan ekspresi Pilih ke kedalaman yang sesuai:Sql yang dihasilkan di kedua instance masih belum intuitif, tetapi tampaknya cukup performant. Saya telah memberikan contoh kecil di GitHub di sini
EF Core
EF Core memiliki metode ekstensi baru
.ThenInclude()
, meskipun sintaksnya sedikit berbeda :Sesuai dokumen, saya akan menyimpan 'indentasi' tambahan
.ThenInclude
untuk menjaga kewarasan Anda.Info Usang (Jangan lakukan ini):
Pemuatan banyak cucu dapat dilakukan dalam satu langkah, tetapi ini membutuhkan pembalikan yang agak canggung grafik sebelum menuju ke simpul berikutnya (NB: Ini TIDAK bekerja dengan
AsNoTracking()
- Anda akan mendapatkan kesalahan runtime):Jadi saya akan tetap dengan opsi pertama (satu Sertakan per model kedalaman entitas daun).
sumber
Anda mungkin menemukan artikel yang menarik ini yang tersedia di codeplex.com .
Artikel ini menyajikan cara baru mengekspresikan kueri yang menjangkau beberapa tabel dalam bentuk bentuk grafik deklaratif.
Selain itu, artikel tersebut berisi perbandingan kinerja menyeluruh dari pendekatan baru ini dengan pertanyaan EF. Analisis ini menunjukkan bahwa GBQ dengan cepat mengungguli kueri EF.
sumber
Bagaimana Anda membuat kueri LINQ ke Entitas untuk memuat objek anak secara langsung, alih-alih memanggil properti Referensi atau Memuat ()
Tidak ada cara lain - kecuali menerapkan pemuatan malas.
Atau memuat secara manual ....
sumber