链接到实体聚合方法替换

Pet*_*zek 6 linq-to-entities entity-framework entity-framework-6

看起来Linq to Entities不支持Aggregate方法.我需要将这.Select(a => a.Permissions).Aggregate((a, b) => a | b)部分更大的表达式重写为Linq to Entities所理解的内容.可能吗?

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

  1. DefaultOrganizerPermissions - 每个管理器都有一些默认权限
  2. OwnerPermissions - 如果User是Organizer的所有者,他还有一些额外的权限
  3. UserPermisions - 可以手动分配用户以获得一些对管理器的权限
  4. 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);
Run Code Online (Sandbox Code Playgroud)

简化它是这样的:

organizers = organizers.Where(o => ((
        DefaultOrganizerPermissions |
        OwnerOrganizerPermissions |
        UserPermisions  |
        RolePermissions
        ) & requiredPermissions) == requiredPermissions);
Run Code Online (Sandbox Code Playgroud)

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

小智 0

如果数据量不是特别大,您可以考虑在语句.ToList()之前调用Select(...)将数据读入内存,然后以 Linq to Objects 的方式执行聚合