簡體   English   中英

LINQ多對多查詢實體框架

[英]Many to many linq query Entity Framework

我有三個表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);

但這只會返回一封沒有任何作用的電子郵件。

無論是使用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);

更新:您更新(改變andor )使得它微不足道的-只是改變AllAny您原始查詢。

問題是.All()要求所有項目都匹配,這意味着如果用戶具有除“ admin”或“ editor”以外的任何角色,則結果將為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM