多对多 linq 查询实体框架

本文关键字:框架 实体 linq 查询 | 更新日期: 2023-09-27 18:33:11

我有三个表UsersUserRolesUserInRole

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);

但这只会返回一封没有角色的电子邮件。

多对多 linq 查询实体框架

要么使用两个中的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