Фильтрация по ThenInclude с EntityFrameworkPlus IncludeFilter - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь отфильтровать три дочерних уровня вниз и найти только дочерние элементы, в которых PropertyMailingAddress.Status == True.

Как преобразовать фильтр на три уровня вниз и провести вложенную фильтрацию с EntityFrameworkPlus IncludeFilter? Каков наиболее эффективный способ?

Структура классов вложена следующим образом:

  1. Property
  2. PropertyParty
  3. Party
  4. PartyMailingAddress
  5. PropertyMailingAddress <--- Статус должен быть равен true (все узлы PropertyMailingAddress внуков со статусом Status == False должны быть удалены из этой вложенной ветви внуков, оставьте узлы PropertyMailingAddress, которые имеют значение True) </strong>

Этот оригинальный способ не работает:

var result = await db.Property.Include(pm => pm.PropertyParty)
                    .Include(pm => pm.PropertyParty)
                    .ThenInclude(x => x.Party)
                    .ThenInclude(x => x.PartyMailingAddress)
                    .ThenInclude(x => x.PropertyMailingAddress)
                    .Where(a => a.PropertyParty.Any(x => (x.Party.PartyMailingAddress.Any(z => z.PropertyMailingAddress.Any(h => h.Status == true))))).ToListAsync();

Попытка эффективного способа с Entity Framework Plus: нужно ли повторно соединить последнюю строку с вложенными вышеупомянутыми местами, или ниже штраф?

var result = await db.Property.Include(pm => pm.PropertyParty)
                    .Include(pm => pm.PropertyParty)
                    .ThenInclude(x => x.Party)
                    .ThenInclude(x => x.PartyMailingAddress)
                    .ThenInclude(x => x.PropertyMailingAddress)
                    .IncludeFilter(y => y.PropertyMailingAddress.Where(z => z.Status == true)).ToListAsync();

* Нам потребуются все вложенные сущности при фильтрации,

В настоящее время используется Net Core 2.2

1 Ответ

2 голосов
/ 27 мая 2020

Вы не можете смешивать Include с IncludeFilter.

В EF Core IncludeFilter должен автоматически добавлять все пути.

У нас нет определения класса, поэтому он затрудняет точное определение взаимосвязи, но запрос должен выглядеть следующим образом:

var result = await db.Property.IncludeFilter(pm => pm.PropertyParty
                                .Select(x => x.Party)
                                .SelectMany(x => x.PartyMailingAddress)
                                .SelectMany(x => x.PropertyMailingAddress.Where(z => z.Status == true)).ToListAsync();

Фильтрация выполняется в базе данных. Так что будьте осторожны с EF Core 2.x, так как у них есть оценка на стороне клиента, которую они удалили в EF Core 3.x, что вызывало некоторые проблемы.

Если вам нужна дополнительная помощь, просто предоставьте работоспособное решение в нашем система отслеживания проблем: https://github.com/zzzprojects/EntityFramework-Plus/issues

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...