2009-05-19 4 views
0

Seiten haben Rollen. Benutzer haben Rollen. Ein Benutzer kann nur dann eine Seite anzeigen, wenn er und er eine oder mehrere Rollen teilen.Wie kann ich leicht feststellen, ob zwei Auflistungen von .NET-EntityObjects dieselben Objekte enthalten?

Dies funktioniert:

Dim Allow As Boolean = False 
CurrentPage.Roles.Load() 
For Each r As Role In CurrentPage.Roles 
    r.Users.Load() 
    For Each u As User In r.Users 
     If u.Id = CurrentUser.Id Then 
      Allow = True 
      Exit For 
     End If 
    Next 
    If Allow Then 
     Exit For 
    End If 
Next 

Ich will nicht verschachtelte Schleifen verwenden, um, wenn ich anstatt es in weniger Codezeilen mit LINQ oder Lambda-Ausdruck tun.

Diese gibt immer False:

Dim Allow As Boolean = (CurrentPage.Roles.ToList.Intersect(CurrentUser.Roles.ToList).Count > 0) 

Ich denke, es schlägt fehl, weil Rollen EntityObjects sind.

Wie kann ich dafür sorgen, dass nur die Rollen-ID-Werte verglichen werden, um die Gleichheit zu bestimmen?

Antwort

2

Sie müssten entweder den zweiten Parameter der Intersect-Methode verwenden, um Ihren eigenen benutzerdefinierten IEqualityComparer zu liefern, oder Sie könnten dies versuchen. Es sieht irgendwie komisch aus, aber es macht Sinn, wenn man erst einmal den Dreh raus hat.

If CurrentPage.Roles.Any(Function(Role) Role.Users.Any(Function(User) User.Id = CurrentUser.Id)) Then 
    'User has role 
End If 

Dies funktioniert möglicherweise nicht, wenn Sie in der Tat Ihre Benutzer in jeder Iteration laden müssen. Wenn Sie von EntityFramework laden, würde ich empfehlen, eifrig Sie sie so etwas wie folgt laden.

CurrentPage.Roles.Include („Benutzer“) Alle (...

Oder ich angelegt habe auch meine eigene EnsureLoaded() Erweiterung, die das Objekt in etwa so zurückgibt:

If CurrentPage.Roles.Any(Function(a) a.Users.EnsureLoaded().Any(Function(b) b.Id = CurrentUser.Id)) Then 

Aber wenn Sie die db jede Seite Anfrage schlagen, dann stellen Sie sicher, dass Sie Profiler überprüfen und sicherstellen, dass Sie nur eine Abfrage ausgeführt werden und nicht eine Abfrage für Jede Rolle

Verwandte Themen