Как создать выражение where во вложенных объектах - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующий запрос EF:

Checklist checklist = await context.Checklist.Where(c => c.CHECKLIST_ID == id)
          .Include("Employee").Include("EmployeeArchive").Include("ChecklistResponses")
          .Include("ChecklistComments").Include("ChecklistResponses.ChecklistQuestion.ChecklistGroup")
          .Include("ChecklistResponses.ChecklistQuestion")
          .Include("ChecklistResponses.Employee").FirstAsync();

Я хочу создать предложение where для сущности ChecklistQuestion, но оно имеет 3 уровня глубины, и кажется, что я не могу встроить его в предложение Where, так как стоит. ChecklistQuestion является отношением «один ко многим» с ChecklistResponses.

То, что я получаю, - это контрольный список для одного объекта со всеми связанными объектами. ChecklistResponses будет иметь несколько строк. Я пытаюсь ограничить ChecklistResponses значением ChecklistQuestion.GROUP_ID! = 4.

ОБНОВЛЕНИЕ: По мнению Microsoft, невозможно фильтровать объекты с помощью Включить с помощью обычной Entity Framework. https://docs.microsoft.com/en-us/ef/ef6/querying/related-data?redirectedfrom=MSDN#explicitFilter У меня есть два варианта, если я не могу сделать это в Включить. Я мог бы фильтровать на клиенте. (У меня есть основной вид с частичным видом). Или я мог бы сделать явный оператор Load.

1 Ответ

0 голосов
/ 30 апреля 2020

Прежде всего, при использовании методов расширения LINQ более распространенным является использование синтаксиса лямбда-выражений, поэтому я буду его использовать. Тогда, я думаю, вам нужно расширение «ThenInclude», которое позволит вам то, что вы ищете. Я пропустил дополнительные Включения, чтобы получить это более кратким.

Checklist checklist = await context.Checklist.Where(c => c.CHECKLIST_ID == id)             
    .Include(c => c.ChecklistResponses)
    .ThenInclude(c => c.ChecklistResponses.
    .Where(q => q.ChecklistQuestion.GROUP_ID != 4))
    .FirstOrDefaultAsync();
...