[英]Entity Framework complex multiple where condition
我有一个数据库,我试图在其中跟踪文档审批。 每个文档有 1 个或多个任务。 每个任务都有 1 个或多个批准。 每个批准都有分配给分配的用户和分配的组的 ID。 每个用户可能属于 1 个或多个组,并且在每个组中可能拥有不同的权限。 此信息存储在“多对多”关系表中,并具有用于权限级别的附加字段。 (user_id, group_id,permission_id)
例如,对任务的批准可以分配给 ID=5 的用户和 ID=7 的组。 为了让用户批准此批准,他们的用户 ID 必须为 5 或属于具有批准权限的组 7。
我想创建一个查询,该查询选择分配给特定用户或属于特定用户具有“意识”权限的组的所有批准。
我已经能够轻松地查询用户 ID:
var approvals = context.APPROVALS
.Where(a => a.APPROVER_ID == CurrentUserID)
.ToList();
我的问题还在于检查当前用户具有“意识”权限的组。 我能想到的最好的方法是存储用户“意识”组的列表(在下面的示例中存储为 CurrentUserAwarnessGroups)并执行如下操作:
var approvals = context.APPROVALS
.Where(a => a.APPROVER_ID == CurrentUserID || CurrentUserAwarnessGroups.Contains(a.GROUP_ID))
这个查询方法对我来说失败了,更不用说我假设它必须至少在客户端执行这个查询的一部分,这意味着返回一个更大(更长)的查询。
任何人都可以提出更好的方法来执行此功能吗? 如有必要,我可以更改我的数据库。
所以我能够想出一个更好的方法。 我的做法是错误的。 我没有尝试查询批准并包含相关用户,而是按用户查询并纯粹基于他们的组包含相关批准。 我确定批准组将始终包含批准者 ID,因此我可以单独按组查询数据库,然后在客户端计算机上按批准者进行过滤。 此外,通过使用按位比较来控制 mxmissile 推荐的“成员资格”,我能够简化我的组到用户表。
我的解决方案如下:
var user = context.USERs
.Where(u => u.USER_ID == CurrentUserID)
.FirstOrDefault();
var tempUserApprovals = user.GROUPTOUSER.SelectMany("GROUP.APPROVALS");
var userApprovals = new ObservableCollection<APPROVAL>();
foreach(var approval in tempUserApprovals)
{
foreach(var group in CurrentUsersGroups)
{
if(approval.GROUP.GROUP_ID == group.GROUP_ID && ((int)group.MEMBERSHIP & Membership.is_aware == Membership.is_aware || approval.APPROVER_ID == CurrentUserID))
{
userApprovals.Add(approval);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.