Как отфильтровать внуков с помощью EF PLUS - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу получить Parent и только его активные Children и активные Grand Children, используя Entityframework Plus

Отношения
Родитель -> Дети -> GrandChildren

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()

Вышеуказанный запрос не работает. Дети не фильтруются. Возвращает всех детей, включая неактивных детей. Однако GrandChildren фильтруется (хотя я предполагаю, что Grand Childeren фильтруются в памяти не в sql)

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы также должны включить фильтр для детей во второй раз, когда используете 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()
0 голосов
/ 27 февраля 2020

Это то, что я в конечном итоге использовал. Это создает 3 sql заявления

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()
...