多对多 linq 查询实体框架
本文关键字:框架 实体 linq 查询 | 更新日期: 2023-09-27 18:33:11
我有三个表Users
、UserRoles
、UserInRole
。
Users UserInRole UserRole
------ ---------- --------
Id UserId RoleId
Name RoleId Name
Email
我想选择具有"管理员"或"编辑"角色的用户电子邮件。
var emails = userUnitOfWork.Repository.Select()
.Where(u => u.UserRoles
.All(r=>r.Name=="admin" || r.Name=="editor")).Select(t=>t.Email);
但这只会返回一封没有角色的电子邮件。
要么使用两个中的and
任何这样的条件
var emails = userUnitOfWork.Repository.Select()
.Where(u => u.UserRoles.Any(r => r.Name == "admin")
&& u.UserRoles.Any(r => r.Name == "editor"))
.Select(t=>t.Email);
或像这样的单个计数条件
var emails = userUnitOfWork.Repository.Select()
.Where(u => u.UserRoles.Count(r => r.Name == "admin" || r.Name == "editor") == 2)
.Select(t=>t.Email);
更新:您的更新(将and
更改为or
)使其变得微不足道 - 只需在原始查询中将All
更改为Any
即可。
问题是.All()
要求所有项目都匹配,这意味着如果用户具有"管理员"或"编辑者"以外的任何角色,则结果将为 false。
对此的解决方案是使用.Any()
var emails = userUnitOfWork.Repository.Select()
.Where(
u => u.UserRoles.Any(r=>r.Name=="admin")
&& u.UserRoles.Any(r =>r.Name =="editor")
)
.Select(t=>t.Email