It seems that Linq to Entities does not support the Aggregate method. I need to rewrite this part of .Select(a => a.Permissions).Aggregate((a, b) => a | b) larger expression to what Linq to Entities understands. Is it possible?
Perhaps I should give you a better explanation of what I am doing. I need to get a collection of Organizers from a database based on user rights for these Organizers. Permissions are saved as bit flags and are a combination of the following:
- DefaultOrganizerPermissions - each organizer has specific default permissions
- OwnerPermissions - If the User is the owner of the Organizer, he has additional permission.
- UserPermisions. Users can be manually assigned permissions to the organizer.
- RolePermissions - Users can be members of roles, and additional permissions for organizers can be assigned to these roles.
So I have a method with the following signature
public IQueryable<Organizer> GetOrganizers(Person person, OrganizerPermissions requiredPermissions)
and inside it there is such a code
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);
It is simplified something like this:
organizers = organizers.Where(o => (( DefaultOrganizerPermissions | OwnerOrganizerPermissions | UserPermisions | RolePermissions ) & requiredPermissions) == requiredPermissions);
The problem is that the user can be a member of several roles, so RolePermissions are actually multiple permissions, and I need to smooth it out with bitwise OR. But what if Aggregate is not supported?
source share