【发布时间】:2017-06-09 12:23:06
【问题描述】:
我一直在努力弄清楚 github 上到底发生了什么事情的细节
所有这一切的关键是我正在尝试将这样的过滤器应用于上下文......
builder.Filter("UserProcesses",
(Process p, string user) => !p.Roles.Any() || p.Roles.Any(r => r.Users.Any(u => u.UserName == user && (bool)r.Read)),
(CoreDataContext ctx) => ctx.AuthInfo.Name
);
当评估表达式树并尝试生成 SQL 查询时,这会导致 EF 中的运行时表达式,所以我想我可以尝试其他方法并解决它并想出这个...
builder.Filter("UserProcesses",
(Process p, string user) => !p.Roles.Any() || p.Roles.Any(r => r.Read ?? false && r.Users.Any(u => u.UserName == user)),
(CoreDataContext ctx) => ctx.AuthInfo?.Name
);
执行时的最终结果...
var proesses = ctx.Processes.ToList();
...是我得到了 EF 生成的这个 SQL 查询(如在分析器中看到的)...
exec sp_executesql N'SELECT
[Extent1].[Id] AS [Id],
[Extent1].[FirstProcessStepId] AS [FirstProcessStepId],
[Extent1].[Name] AS [Name]
FROM [Workflow].[Processes] AS [Extent1]
WHERE ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[ProcessRoles] AS [Extent2]
WHERE [Extent1].[Id] = [Extent2].[Process_Id]
)) OR ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[ProcessRoles] AS [Extent3]
INNER JOIN [dbo].[Roles] AS [Extent4] ON [Extent4].[Id] = [Extent3].[Role_Id]
WHERE ([Extent1].[Id] = [Extent3].[Process_Id]) AND ((CASE WHEN ([Extent4].[Read] IS NULL) THEN cast(0 as bit) ELSE [Extent4].[Read] END) = 1)
)) ',N'@DynamicFilterParam_000002 bit',@DynamicFilterParam_000002=NULL
最终结果是我的测试数据应该有 1 个流程实体被过滤掉,因为它链接到用户不属于的角色。
【问题讨论】:
-
尽量不要发布原始网址
标签: c# sql-server entity-framework linq-to-entities