Игнорировать глобальный фильтр запросов для объединенных сущностей - PullRequest
0 голосов
/ 02 августа 2020

Глобальные фильтры запросов очень удобны при реализации функций клиента и мягкого удаления.

Но моя проблема в том, что когда я пишу запрос с объединениями, например

dbContext
    .entity1
    .Include("entity2.entity3.entity4")
    .Where(something)
    .select(something)
    .toList();

и каждый одна из этих сущностей имеет глобальные фильтры, затем в сгенерированном SQL я получаю для каждого JOIN полный подзапрос, в котором он выбирает все поля этого объекта и проверяет наличие глобальных фильтров.

Но я не хочу этого. Я хочу, чтобы глобальные фильтры применялись только к объекту root запроса (entity1), а ко всем остальным объектам присоединяться нормально.

кстати, отношения между объектами следующие:

  • 1 entity4 -> N entity3
  • 1 entity3 -> N entity2
  • 1 entity2 -> N entity1

В моем случае каждая сущность получает свою "tenant" поле установлено, и при мягком удалении объекта это мягкое удаление каскадно ко всем его дочерним и дочерним элементам. Из-за этого проверка этих полей для каждого соединения - пустая трата времени.

1 Ответ

0 голосов
/ 06 августа 2020

На данный момент вы не можете игнорировать фильтр запроса в Include. В репозитории EF Core есть проблема , касающаяся улучшения фильтров запросов, но не go в EF Core 5.

Один из подходов, который может помочь, - это запуск нескольких запросов и полагаться. в функции EF Core реляционное исправление , чтобы объединить все вместе (я объясняю реляционное исправление в своей статье EF Core Подробно - что происходит, когда EF Core читает из базы данных? ).

Вот пример выполнения двух запросов, в которых реляционные исправления будут объединены.

var mainEntities = dbContext.entity1
   .Where(something)
   .Select(something) //But must contain the ent1 primary key, e.g. Id
   .ToList();
var ent2list = dbContext.entity2.IgnoreQueryFilters()
   .Include("entity3.entity4")
   .Where(ent2 => mainEntities.Select(ent1 => ent1.Id).Contains(ent2.Id)
   .ToList();

В конце этого реляционного исправления EF Core заполнит свойство навигации entity2 в соответствующем экземпляре entity1. ПРИМЕЧАНИЕ: реляционное исправление не работает, если вы используете AsNoTracking.

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