【问题标题】:How can I easily tell if two collections of .NET EntityObjects contain any of the same objects?如何轻松判断两个 .NET EntityObjects 集合是否包含任何相同的对象?
【发布时间】:2009-05-19 19:35:01
【问题描述】:

页面具有角色。用户有角色。一个用户只能查看一个页面,如果他和它共享一个或多个角色。

这行得通:

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 或 lambda 表达式用更少的代码行来代替,我不想使用嵌套循环。

这总是返回 False:

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

我认为它失败了,因为角色是实体对象。

如何让它只比较 Role Id 值以确定相等性?

【问题讨论】:

    标签: .net vb.net entity-framework generics


    【解决方案1】:

    您必须使用 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("Users").Any(...

    或者我还创建了自己的 EnsureLoaded() 扩展,它返回的对象如下:

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

    但是,如果您在每个页面请求中都访问数据库,请确保检查分析器并确保您只执行一个查询,而不是为每个角色执行一个查询。

    【讨论】:

      猜你喜欢
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多