加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 程序设计 > 正文

entity-framework – 实体聚合方法替换的链接

发布时间:2020-05-23 19:10:43 所属栏目:程序设计 来源:互联网
导读:看起来 Linq to Entities不支持Aggregate方法.我需要重写这个.选择(a = a.Permissions).Aggregate((a,b)= a | b)更大表达式的一部分到Linq to Entities理解的东西.可能吗? 也许我应该更好地解释一下我在做什么.我需要根据这些组织者的用户权限从数据库中获取

看起来 Linq to Entities不支持Aggregate方法.我需要重写这个.选择(a => a.Permissions).Aggregate((a,b)=> a | b)更大表达式的一部分到Linq to Entities理解的东西.可能吗?

也许我应该更好地解释一下我在做什么.我需要根据这些组织者的用户权限从数据库中获取组织者的集合.权限存储为位标志,并且是以下各项的组合:

> DefaultOrganizerPermissions – 每个管理器都有一些默认权限
> OwnerPermissions – 如果用户是组织者的所有者,他还有一些额外的权限
> UserPermisions – 可以手动分配用户以获得一些对管理器的权限
> RolePermissions – 用户可以是角色的成员,可以指定这些角色对组织者具有其他权限.

所以我有一个带有以下签名的方法

public IQueryable< Organizer> GetOrganizers(Person person,OrganizerPermissions requiredPermissions)

在里面有一个像这样的代码

organizers = organizers.Where(o => ((
        // Default permissions
        DefaultOrganizerPermissions |
        // Owner permissions
        (o.OwnerId == person.Id ? OwnerOrganizerPermissions : 0) |
        // Personal permissions
        (o.AccessIdentifier.Accesses.FirstOrDefault(a => a.Accessor is PersonalAccessor && (a.Accessor as PersonalAccessor).PersonId == person.Id) != null ?
        (OrganizerPermissions)o.AccessIdentifier.Accesses.FirstOrDefault(a => a.Accessor is PersonalAccessor && (a.Accessor as PersonalAccessor).PersonId == person.Id).Permissions : 0) |
        // Role permissions
        (o.AccessIdentifier.Accesses.Any(a => a.Accessor is RoleAccessor && (a.Accessor as RoleAccessor).Role.RoleMembers.Any(rm=>rm.PersonId == person.Id)) ?
        (OrganizerPermissions)o.AccessIdentifier.Accesses.Where(a=> a.Accessor is RoleAccessor && (a.Accessor as RoleAccessor).Role.RoleMembers.Any(rm => rm.PersonId == person.Id)).Select(a=>a.Permissions).Aggregate((a,b) => a | b) : 0)
        ) & requiredPermissions) == requiredPermissions);

简化它是这样的:

organizers = organizers.Where(o => ((
        DefaultOrganizerPermissions |
        OwnerOrganizerPermissions |
        UserPermisions  |
        RolePermissions
        ) & requiredPermissions) == requiredPermissions);

问题是用户可以是多个角色的成员,因此RolePermissions实际上是多个权限,我需要使用按位OR将其展平.但是,如果不支持Aggregate呢?

如果数据量不是非常大,您可以考虑在Select(…)语句之前调用.ToList()将数据读入内存,然后执行Aggregate as Linq to Objects

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读