Metode Include () berfungsi cukup baik untuk Daftar pada objek. Tapi bagaimana jika saya harus pergi dua level? Misalnya, metode di bawah ini akan mengembalikan ApplicationServers dengan properti yang disertakan yang ditampilkan di sini. Namun, ApplicationsWithOverrideGroup adalah wadah lain yang menampung objek kompleks lainnya. Bisakah saya melakukan Include () di properti itu juga? Atau bagaimana saya bisa membuat properti itu dimuat sepenuhnya?
Seperti sekarang, metode ini:
public IEnumerable<ApplicationServer> GetAll()
{
return this.Database.ApplicationServers
.Include(x => x.ApplicationsWithOverrideGroup)
.Include(x => x.ApplicationWithGroupToForceInstallList)
.Include(x => x.CustomVariableGroups)
.ToList();
}
Akan mengisi hanya properti yang Diaktifkan (di bawah) dan bukan properti Aplikasi atau CustomVariableGroup (di bawah). Bagaimana saya mewujudkan ini?
public class ApplicationWithOverrideVariableGroup : EntityBase
{
public bool Enabled { get; set; }
public Application Application { get; set; }
public CustomVariableGroup CustomVariableGroup { get; set; }
}
c#
entity-framework
eager-loading
Bob Horn
sumber
sumber
Expression must be a member expression
ketika saya mencoba ini: Untuk menyertakan koleksi dan kemudian tingkat koleksi satu ke bawah:query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection))
.Jawaban:
Untuk EF 6
Pastikan Anda menambahkan
using System.Data.Entity;
untuk mendapatkan versiInclude
yang menggunakan lambda.Untuk EF Core
Gunakan metode baru
ThenInclude
sumber
Include
untuk setiap properti:Db.States.Include(state => state.Cities.Select(city => city.Customers).Include(state => state.Cities.Select(city => city.Vendors)
Jika saya mengerti Anda dengan benar, Anda bertanya tentang menyertakan properti bersarang. Jika begitu :
atau
atau
sumber
Include(string path)
versi metode ini.EF Core: Menggunakan "ThenInclude" untuk memuat level mutiple: Misalnya:
sumber
Saya membuat pembantu kecil untuk Entity Framework 6 (.Net Core style), untuk memasukkan sub-entitas dengan cara yang baik.
Itu ada di NuGet sekarang: Instal-Paket ThenInclude.EF6
Paket ini tersedia di GitHub .
sumber
DbSet<One>().Include(x => x.Two.Three.Four.Five.Six)
menggunakan satu-satunya kelemahan saat Anda sedang menghitung produk kartesius dan berpotensi meningkatkan bandwidth.Lebih banyak contoh EFCore di MSDN menunjukkan bahwa Anda dapat melakukan beberapa hal yang cukup rumit dengan
Include
danThenInclude
.Ini adalah contoh yang baik tentang seberapa kompleks Anda bisa mendapatkan (ini semua adalah satu pernyataan!):
Lihat bagaimana Anda dapat rantai
Include
bahkan setelahThenInclude
dan itu semacam 'me-reset' Anda kembali ke tingkat entitas tingkat atas (Instruktur).Anda bahkan dapat mengulangi koleksi 'tingkat pertama' yang sama (Tugas Kursus) beberapa kali diikuti dengan
ThenIncludes
perintah terpisah untuk sampai ke entitas anak yang berbeda.Perhatikan bahwa permintaan Anda yang sebenarnya harus ditandai pada akhir rantai
Include
atauThenIncludes
. Berikut ini TIDAK berfungsi:Akan sangat menyarankan Anda mengatur pencatatan dan memastikan pertanyaan Anda tidak di luar kendali jika Anda memasukkan lebih dari satu atau dua hal. Sangat penting untuk melihat cara kerjanya - dan Anda akan melihat setiap 'sertakan' yang terpisah biasanya merupakan kueri baru untuk menghindari gabungan besar-besaran yang mengembalikan data yang berlebihan.
AsNoTracking
dapat sangat mempercepat jika Anda tidak benar-benar mengedit entitas dan menyimpan ulang.sumber
Saya juga harus menggunakan banyak termasuk dan pada level 3 saya membutuhkan beberapa properti
Ini dapat membantu seseorang :)
sumber
.Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt......
Biarkan saya menyatakan dengan jelas bahwa Anda dapat menggunakan string overload untuk memasukkan level bersarang terlepas dari banyaknya hubungan yang terkait, jika Anda tidak keberatan menggunakan string literal:
sumber
query.SelectMany(x=>x.foos).Include("bar").Include("bar.docs")...