LINQ to Entity - 具有多对多关系 - VB.NET

时间:2012-03-02 11:04:28

标签: vb.net entity-framework linq-to-entities

我在SQL中有以下表格:

用户(UserID,电子邮件) 角色(RoleID,RoleName) UsersInRoles(UserID,RoleID)

我想带回所有角色的列表和一个字段,该字段表示该角色是否已分配给特定用户。

在SQL中我会使用以下查询执行此操作:

SELECT R.RoleID, RoleName, CASE WHEN ISNULL(UIR.UserID, 0) = 0 THEN 0 ELSE 1 END
FROM Roles R
LEFT JOIN UsersInRoles UIR ON R.RoleID = UIR.RoleID AND UserID = 2

我的实体模型隐藏了UsersInRoles表,而是在每个Users和Roles实体中创建一个导航属性来链接这两个。

我正在尝试编写类似的LINQ to Entity查询,但却无法进行。

你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

您尝试执行的是使用LINQ的外连接。

你可以在这里找到一个例子:
http://www.hookedonlinq.com/OuterJoinSample.ashx

以下是您在案例中的表现方式:

var query = from r in db.Roles
            from u in db.Users
            join uir in u.Roles on r.RoleID equals uir.RoleID into outer
            from o in outer.DefaultIfEmpty()
            where u.UserID == 2
            select new
            {
              RoleID = r.RoleID, 
              RoleName = r.RoleName,
              IsInRole = (o != null)
            }

更新

  • 修正了查询中的错误

答案 1 :(得分:0)

您可以将Enumerable.Select方法项目的角色列表添加到anonymous types中,其中包含您感兴趣的字段:

Dim results = roles.Select(Function(r) New With _
    { _
        .Id = r.RoleId, _
        .Name = r.RoleName, _
        .IsAssigned = r.Users.Any(Function(u) u.UserId = 2) _
    }

如果您想避免子查询,可以在LINQ中表示左外连接:

Dim results = From r In roles
              Group Join u In users On r.RoleId Equals u.RoleId
              Into assignedUsers = Group _
              From au In assignedUsers.DefaultIfEmpty()
              Select New With _
              { _
                  .Id = r.RoleId, _
                  .Name = r.RoleName, _
                  .IsAssigned = If(au Is Nothing, False, au.UserId = 2) _
              }