Как я могу легко определить, содержат ли две коллекции объектов .NET EntityObject один и тот же объект? - PullRequest
0 голосов
/ 19 мая 2009

Страницы имеют роли. У пользователей есть роли. Пользователь может просматривать страницу только в том случае, если он и она имеют одну или несколько ролей.

Это работает:

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

Я не хочу использовать вложенные циклы, если вместо этого могу сделать это в меньшем количестве строк кода с помощью LINQ или лямбда-выражения.

Это всегда возвращает False:

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

Я думаю, что это не сработало, потому что роли - это EntityObjects.

Как мне сделать так, чтобы сравнивались только значения Role Id для определения равенства?

1 Ответ

2 голосов
/ 21 мая 2009

Вам потребуется либо использовать второй параметр метода Intersect, чтобы указать свой собственный IEqualityComparer, либо вы можете попробовать это. Это выглядит довольно забавно, но это имеет смысл, когда вы освоитесь.

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

Хотя это может не сработать, если вам приходится загружать пользователей на каждой итерации. Если вы загружаете из EntityFramework, я бы порекомендовал вам загружать их примерно так:

CurrentPage.Roles.Include ( "Пользователи"). Любой (...

Или я также создал свое собственное расширение EnsureLoaded (), которое возвращает объект примерно так:

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

Но если вы нажимаете db на каждом запросе страницы, убедитесь, что вы проверили профилировщик и убедитесь, что выполняете только один запрос, а не один запрос для каждой роли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...