有一个审计表供用户与系统交互,我需要构建一个执行以下 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 语句(查询符号)来排除目标角色。
使用我的SQL to LINQ Recipe中的规则7和规则9,您可以使用
LEFT JOIN
将join
转换为LINQDefaultIfEmpty()
,并使用匿名对象实现多个相等条件:
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()
- 我不确定它的翻译效果如何。