Es sieht aus wie die Linq to Entities unterstützt Aggregate
Methode. Ich muss diesen Teil des größeren Ausdrucks in etwas umschreiben, das Linq für Entitäten versteht. Ist es möglich?Link zu Entities Aggregate Methode Ersatz
Vielleicht sollte ich Ihnen eine bessere Erklärung geben, was ich mache. Ich muss eine Sammlung von Organisatoren von der Datenbank basierend auf Benutzerberechtigungen zu diesen Organisatoren bekommen. Berechtigungen werden als Bitflags gespeichert und sind eine Kombination der folgenden Optionen:
- DefaultOrganizerPermissions - Jeder Veranstalter einige Standardberechtigungen
- OwnerPermissions hat - Wenn Benutzer der Besitzer des Veranstalters ist, hat er einige zusätzliche Erlaubnis
- UserPermisions - Benutzer können manuell zugewiesen werden, um Berechtigungen für den Organisator zu haben
- RolePermissions - Benutzer können Mitglieder von Rollen sein und diesen Rollen können zusätzliche Berechtigungen für Organisatoren zugewiesen werden.
So habe ich eine Methode mit der folgenden Signatur
public IQueryable<Organizer> GetOrganizers(Person person, OrganizerPermissions requiredPermissions)
und im Innern gibt es einen Code wie diese
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);
Vereinfachtes es so etwas wie das ist:
organizers = organizers.Where(o => ((
DefaultOrganizerPermissions |
OwnerOrganizerPermissions |
UserPermisions |
RolePermissions
) & requiredPermissions) == requiredPermissions);
Das Problem besteht darin, dass Benutzer Mitglied mehrerer Rollen sein können. Daher sind RolePermissions eigentlich mehrere Berechtigungen, und ich muss sie mit bitweisem ODER reduzieren. Aber wie, wenn Aggregat nicht unterstützt wird?
Ich habe dies schon einmal versucht, aber es hat keine Wirkung. –
Haben Sie das versucht? .... ToList(). Wählen Sie (a => a.Permissions) .Aggregat ((a, b) => a | b) ToList() materialisiert die Abfrage (so ist schlecht) aber es sollte funktionieren ... Sie habe auch andere Möglichkeiten, zB Sum oder wähle nur eine, die wahr ist (FirstOrDefault) aber du solltest expliziter sein. – bubi
@bubi Ja, habe ich. Ich benutze tuList() in einer anderen Methode in der gleichen Klasse und es funktioniert. Aber es funktioniert nicht in diesem. Ich denke, es ist merkwürdig, ich würde erwarten, dass es entweder funktioniert oder einen (anderen) Fehler hervorruft, aber es gibt keine Veränderung. Ich muss nur einige Bit-Flags zusammenführen (sie werden als Ganzzahlen dargestellt), wie zum Beispiel 1010 | 0011 = 1011. Ich weiß nicht, ob es mit Sum möglich ist. –