Клиентское расширение 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 с помощью предложений.

Может кто-нибудь поделиться некоторыми соображениями о том, как я могу действовать, или, может быть, есть реализация, которую они могут раздеть и поделиться? Будем очень признательны.

0 ответов

Другие вопросы по тегам