Como eu posso facilmente dizer se duas coleções de .NET EntityObjects conter qualquer um dos mesmos objetos?

votos
0

Páginas têm papéis. Os usuários têm Roles. Um usuário só pode exibir uma página se ele e compartilhar uma ou mais funções.

Isso funciona:

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

Eu não quero ter que usar loops aninhados se eu posso, em vez fazê-lo em menos linhas de código com LINQ ou uma expressão lambda.

Isso sempre retorna False:

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

Eu acho que falha porque Roles são EntityObjects.

Como posso fazê-lo comparar apenas os valores ID da função para determinar a igualdade?

Publicado 19/05/2009 em 20:35
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Você teria que usar o segundo parâmetro do método Intersect para abastecer seu próprio costume IEqualityComparer ou você poderia tentar isso. Parece meio engraçado, mas faz sentido quando você pegar o jeito dele.

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

Embora este pode não funcionar se você tem que, de fato, carregar seus usuários em cada iteração. Se você estiver carregando a partir EntityFramework, eu recomendo que você carga ansiosos lhes algo parecido com isto:

CurrentPage.Roles.Include ( "Usuários"). Qualquer (...

Ou eu também criei minha própria extensão EnsureLoaded (), que retorna o objeto algo como isto:

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

Mas se você está batendo a db cada solicitação de página, em seguida, certifique-se verificar profiler e certifique-se você está apenas executando uma consulta e não uma consulta para cada papel.

Respondeu 21/05/2009 em 06:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more