2016-02-04 194 views
0

我有三個表UsersUserRoles,UserInRole多對多linq查詢實體框架

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

但它只返回一個沒有任何作用的郵件。

回答

1

要麼使用兩個Any條件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); 

或單個Count條件這樣

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

UPDATE:您的更新(改變andor)使得它微不足道的 - 只需在原始查詢中將All更改爲Any即可。

+0

我更新「和」「或」 – barteloma

0

問題是.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