我在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查询,但却无法进行。
你能帮忙吗?
答案 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) _
}