许多对linq查询实体框架

时间:2016-02-04 18:19:53

标签: c# entity-framework linq

我有三张表UsersUserRolesUserInRole

Users     UserInRole    UserRole
------    ----------    --------
Id        UserId        RoleId
Name      RoleId        Name
Email 

我想选择" admin" "编辑" 角色的用户电子邮件。

var emails = userUnitOfWork.Repository.Select()
     .Where(u => u.UserRoles
     .All(r=>r.Name=="admin" || r.Name=="editor")).Select(t=>t.Email);

但只返回一个没有角色的电子邮件。

2 个答案:

答案 0 :(得分:1)

使用and这样的两个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);

或像这样的Count条件

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即可。

答案 1 :(得分:0)

The issue is that .All() requires all items to match, this means that if the user has any roles other than "admin" or "editor" the result will be false.

a solution to this is to use .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