【问题标题】:How do I get this result using LINQ?如何使用 LINQ 获得此结果?
【发布时间】:2010-10-26 19:58:55
【问题描述】:

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

【问题讨论】:

标签: .net asp.net-mvc linq


【解决方案1】:

猜测你的表名:

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的想法

【讨论】:

  • @Mathew。这应该有效。我必须将角色加入到嵌套表中。
【解决方案2】:

棘手的 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

【讨论】:

  • LINQ 不支持左外连接。
【解决方案3】:

约旦;

我确实对此进行了测试,但它只返回两个表中的值,如下所示。

角色名 |角色 |过期日期

会员 |真 | 2011 年 1 月 1 日
会计师 |真 | 2014 年 1 月 1 日

【讨论】:

    【解决方案4】:
    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
                         };
    

    另一种方法,仅作为示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多