LINQ 查找没有给定角色的用户

问题描述 投票:0回答:1

有一个审计表供用户与系统交互,我需要构建一个执行以下 SQL 的 LINQ 查询。这样做的目标是撤回除具有“TargetRole”的用户创建的行之外的所有行:

SELECT distinct a.* 
  FROM AuditTable AS                 a
           JOIN      MyUsers         u  ON a.PaPersonId = u.PaPersonId
           LEFT JOIN AspNetUserRoles ur ON u.Id = ur.UserId
           LEFT JOIN AspNetRoles     r  ON ur.RoleId = r.Id AND r.Name = 'TargetRole'
 WHERE r.Id IS NULL

在实际查询中,where 子句中还有更多内容,但我无法弄清楚如何形成 LINQ 语句(查询符号)来排除目标角色。

asp.net-core linq-to-entities asp.net-core-identity
1个回答
1
投票

使用我的SQL to LINQ Recipe中的规则7和规则9,您可以使用

LEFT JOIN
join
转换为LINQ
DefaultIfEmpty()
,并使用匿名对象实现多个相等条件:

var ans = (from a in AuditTable
           join u in MyUsers on a.PaPersonId equals u.PaPersonID
           join ur in AspNetUserRoles on u.Id equals ur.UserId into urg
           from ur in urg.DefaultIfEmpty()
           join r in AspNetRoles on new { Id = ur.RoleId, Name = "TargetRole" } equals new { r.Id,  r.Name } into rg
           from r in rg.DefaultIfEmpty()
           where r == null
           select a)
          .Distinct();

也可以将

from r in rg.DefaultIfEmpty() where r == null
替换为
where !rg.Any()
- 我不确定它的翻译效果如何。

© www.soinside.com 2019 - 2024. All rights reserved.