Клиентское расширение EF Core dbset и изменение оператора SQL
Я ударился головой о стену в связи с реализацией расширения, похожего на EF Core "Включить". Наша система имеет иерархическую модель безопасности, в которой безопасность можно определить для любого элемента дерева, и она наследуется всеми ее дочерними элементами, если она не переопределена.
По сути, мы надеемся, что сможем закодировать что-то похожее на приведенное ниже, и WithSecurity определяет, что является элементом безопасности Клиента, и что является элементом безопасности Поставщика:
var result = db.Job
.WithSecurity(TaskNames.Job, user.Id, SecurityRights.Create, src => src.Customer, src => src.Supplier)
.Where(src => EF.Functions.Like(src.JobNumber, searchClause));
Это изменит следующее утверждение:
SELECT [JB].[Id],
[JB].[CustomerId],
[JB].[SupplierId]
FROM [Production].[Job] AS [JB]
WHERE [JB].[JobNumber] LIKE @searchClause
Для того, чтобы:
SELECT [JB].[Id],
[JB].[CustomerId],
[JB].[SupplierId],
[Security].[CompileRights] (
MAX([SEC].[Create]),
MAX([SEC].[Read]),
MAX([SEC].[Update]),
MAX([SEC].[Delete]),
MAX([SEC].[Special1]),
MAX([SEC].[Special2]),
MAX([SEC].[Special3]),
MAX([SEC].[Special4])) AS [Rights]
FROM [Security].[GetSecurity](@taskName, @userId, @right) [SEC]
CROSS JOIN [Production].[Job] AS [JB]
INNER JOIN [Core].[Entity] AS [CU] ON [JB].[CustomerId] = [CU].[Id]
AND [CU].[Path].[IsDescendantOf]([SEC].[CustomerPath]) != 0
INNER JOIN [Core].[Entity] AS [SU] ON [JB].[SupplierId] = [SU].[Id]
AND [SU].[Path].[IsDescendantOf]([SEC].[SupplierPath]) != 0
WHERE [JB].[JobNumber] LIKE @searchClause
GROUP BY [JB].[Id],
[JB].[CustomerId],
[JB].[SupplierId]
HAVING MAX([SEC].[SpecificRight]) = 1 -- 0: Not defined, 1: granted, 2: revoked
В настоящее время мы используем встроенные функции значений с FromSQL для обработки вызовов, которые в настоящее время работают, но мне было поручено придумать более элегантный метод, использующий плавный API EF Core.
Я пытался отследить расширения FromSQL и Include в EF Core 2, чтобы попытаться создать свою собственную реализацию, но я изо всех сил, так как мы только недавно начали использовать EF Core.
Поэтому мне нужно изменить группы select, the from и append с помощью предложений.
Может кто-нибудь поделиться некоторыми соображениями о том, как я могу действовать, или, может быть, есть реализация, которую они могут раздеть и поделиться? Будем очень признательны.