Могу ли я форсировать внутренние объединения дополнительными объектами?
Вы не можете.А ты не должен .Потому что, хотя inner join
, вероятно, решит ваш конкретный случай, в целом он отфильтрует все зависимые объекты, имеющие null
FK (например, First.SecondId == null
), что противоречит всей концепции необязательных отношений.
Проблема, которую я вижу, заключается в том, что вы, похоже, пытаетесь использовать Include
для фильтрации.По идее Include
это то, что он говорит - для каждой сущности, возвращаемой запросом, также включают соответствующие данные.Он не предназначен для фильтрации ни сущности, ни связанных данных.
Так что вам нужен фильтр запросов.
Фактическая проблема заключается в том, что EF Core Global Query Filters не поддерживают критерии, основанные на свойствах навигации .Вот почему люди в таких сценариях нарушают нормализацию (вводят избыточность) и помещают TenantId
свойство (столбец) в каждую сущность (таблицу), что позволяет им устанавливать глобальный фильтр для каждой сущности.
С учетом сказанного,явный фильтр запросов (Where
) в настоящее время является единственной опцией.
.Where(p => p.Second.Third.Tenant == _tenant);
Но это нежелательно, поскольку в некоторых крайних случаях _tenant имеет значение null и затем выдаст неверные данные.
Ну, вам просто нужны правильные критерии, учитывающие необязательные отношения, например
.Where(p => p.SecondId == null || p.Second.Third.Tenant == _tenant);
Но это на самом деле показывает проблему отсутствия Tenant
для каждой сущности - когда First.SecondId == null
, вы не можете сказать, какой Tenant
владеет First
.