如何使用LINQ获得此结果?

时间:2010-10-26 19:58:55

标签: .net asp.net-mvc linq

我是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

4 个答案:

答案 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)

约旦;

我测试了这个,但它只返回两个表中的值,如下所示。

RoleName | IsInRole |到期日期

会员|真的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
                     };

另一种方法,它仅用于样本。