我是LINQ的初学者,我有一个查询,我需要这样的结果。
Id | RoleName
-------------------
1 | Member
2 | Admin
3 | Manager
4 | Accountant
Id | UserId| RoleId | ExpirationDate
-------------------------------------
1 | 1 | 1 | 1/1/2011
2 | 1 | 4 | 1/1/2012
3 | 2 | 2 | 1/1/2013
4 | 3 | 3 | 1/1/2014
我希望任何用户的结果如下所示。对于用户ID 1,它应该如下所示。
RoleName | IsInRole | ExpirationDate
-----------------------------------
Member | True | 1/1/2011
Admin | False |
Manager | False |
Accountant | True | 1/1/2014
答案 0 :(得分:2)
猜猜你的桌子名字:
from r in db.Roles
join ur in (from ur2 in db.UsersInRoles
where ur2.UserId == userId
select ur2) on r.RoleId equals ur.RoleId into g
from ur in g.DefaultIfEmpty()
select new {
RoleName = r.Name,
IsInRole = ur != null,
ExpirationDate = ur == null ? null : ur.ExpirationDate };
来自HookedOnLinq的想法
答案 1 :(得分:0)
Tricky LINQ,在SQL中你会做类似的事情:
select r.RollName,
(case when ur.UserId is null then 'False' else 'True' end) as IsInRole,
ur.ExpirationDate
from tblRoles r
left outer join tblUserRoles ur
on r.Id = ur.RoleId
where ur.UserId = 1
答案 2 :(得分:0)
约旦;
我测试了这个,但它只返回两个表中的值,如下所示。
会员|真的1/1/2011
会计师|真的2014年1月1日
答案 3 :(得分:0)
var result = from r in roles
select new { RoleName = r.RoleName,
IsInRole = (from u in usersInRoles
where u.UserId == userId && u.RoleId == r.Id select u).Count() > 0,
ExpriationDate = usersInRoles.SingleOrDefault(u => u.UserId == userId && u.RoleId == r.Id) != null ?
usersInRoles.SingleOrDefault(u => u.UserId == userId && u.RoleId == r.Id).ExpirationDate : null
};
另一种方法,它仅用于样本。