2011-08-04 48 views
0

我的模式是一個相當直接的成員資格和角色模式一面過濾掉任何出現:LINQ到EF - 選擇很多,從衆多一對多

Users table: 
UserId (PK) 
UserName 
etc... 

Roles table: 
RoleId (PK) 
RoleName 

UsersInRole table 
UserId (FK to Users table) 
RoleId (FK to ROles table) 

所以,我們已經拿到了多對多的表UsersInRole以及其他兩個表。當我將模式添加到EF中時,生成的ORM代碼(和EF設計器)僅顯示用戶和角色(沒問題,EF管理多對多)。

所以,這是我的問題。我想列出所有沒有角色「超級管理員」的用戶。看起來像一個簡單的問題,只需在EF中使用SelectMany。問題是用戶可能有多個角色,其中之一是「超級管理員」。如果我使用SelectMany(如下所示),除了其他角色之外,我仍然會獲得擁有「超級管理員」的用戶。 SelectMany只適用於用戶有一個角色和角色是「超級管理員」

我試圖把SQL從LINQ到EF的工作,但沒有任何運氣那也是。

var usrQry = context.Roles.Where(r => r.RoleName != "Super Admin") 
     .SelectMany(r => r.Users); 

任何幫助表示讚賞 - 在此先感謝。

回答

1

您的查詢也將多次返回相同的用戶。您最好回到您的原始聲明並嘗試使代碼看起來更像它。

你的說法是:

我要列出所有不具備的作用「超級管理員」

所以這裏是代碼做誰的用戶。

var userQry = context.Users.Where(
       u => !u.Roles.Any(r => r.RoleName == "Super Admin")); 
在LINQ語法

var userQry = from u in context.users 
       where !u.Roles.Any(r => r.RoleName == "Super Admin") 
       select u;