【问题标题】:Linq to EF - Select Many to filter out any occurrences from one side of many-to-manyLinq to EF - 选择许多以从多对多的一侧过滤掉任何出现
【发布时间】:2011-08-04 01:26:13
【问题描述】:

我的架构是一个相当简单的成员和角色架构:

Users table:
UserId (PK)
UserName
etc...

Roles table:
RoleId (PK)
RoleName

UsersInRole table
UserId (FK to Users table)
RoleId (FK to ROles table)

因此,我们得到了多对多表 UsersInRole 以及其他两个表。当我将架构添加到 EF 时,生成的 ORM 代码(和 EF 设计器)只显示用户和角色(没问题,EF 管理多对多)。

所以,这是我的问题。我想列出所有没有“超级管理员”角色的用户。似乎是一个简单的问题,只需在 EF 中使用 SelectMany。问题是一个用户可能有多个角色,其中之一是“超级管理员”。如果我使用 SelectMany(如下所示),除了其他角色之外,我仍然会获得那些具有“超级管理员”的用户。 SelectMany 仅在用户具有一个角色并且该角色是“超级管理员”时才有效

我已经尝试将 SQL 放在一起,以便将其用于 Linq-to-EF,但也没有任何运气。

var usrQry = context.Roles.Where(r => r.RoleName != "Super Admin")
        .SelectMany(r => r.Users);

任何帮助表示赞赏 - 在此先感谢。

【问题讨论】:

    标签: .net sql entity-framework-4 linq-to-entities


    【解决方案1】:

    您的查询还会多次返回相同的用户。你最好回到你原来的语句,试着让代码看起来更像它。

    你的陈述是:

    我想列出所有没有“超级管理员”角色的用户

    所以这是执行此操作的代码。

    var userQry = context.Users.Where(
                    u => !u.Roles.Any(r => r.RoleName == "Super Admin"));
    

    在 LINQ 语法中:

    var userQry = from u in context.users
                  where !u.Roles.Any(r => r.RoleName == "Super Admin")
                  select u;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多