繁体   English   中英

实体框架复杂的多个 where 条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM