Ich möchte lernen Parent
und seine einzige aktive Children
und aktive Grand Children
- Grand Children
mit EntityFramework plus
Beziehung
Eltern -> Kinder -> Großkinder
var parent = await _dbContext.Parent
.IncludeFilter(p=>p.Children.Where(c=>c.IsActive == true))
.IncludeFilter(p=>p.Children.Select(c=>c.GrandChildren.Where(gc=>gc.IsActive ==true)))
.Where(p=>p.ParnetID == 1234)
.SingleOrDefaultAsync()
Die obige Abfrage funktioniert nicht. Die Kinder werden nicht gefiltert. Es werden alle Kinder einschließlich inaktiver Kinder zurückgegeben. Allerdings wird GrandChildren gefiltert (ich vermute jedoch, dass Grand Childeren im Speicher gefiltert werden, nicht in SQL)
Sie müssen den Filter auch bei der zweiten Verwendung von IncludeFilter
die IncludeFilter
. Andernfalls werden die ungefilterten IncludeFilter
.
var parent = await _dbContext.Parent
.IncludeFilter(p=>p.Children.Where(c=>c.IsActive == true))
.IncludeFilter(p=>p.Children.Where(c=>c.IsActive == true).Select(c=>c.GrandChildren.Where(gc=>gc.IsActive ==true)))
.Where(p=>p.ParnetID == 1234)
.SingleOrDefaultAsync()
Dies ist, was ich am Ende verwendet habe. Dadurch werden 3 SQL-Anweisungen erstellt
var parent = await _dbContext.Parent
.IncludeFilter(p=>p.Children.Where(c=>c.IsActive == true).Select(c=>c.GrandChildren.Where(gc=>gc.IsActive ==true)))
.Where(p=>p.ParnetID == 1234)
.SingleOrDefaultAsync()