2009-08-05 170 views
1

我剛剛完成創建使用LINQ to SQL進行數據訪問的自定義角色提供程序。您需要爲提供者編寫的一項功能是從角色中刪除用戶;LINQ to SQL多對多比較查詢

public void RemoveUsersFromRoles(string[] usernames, string[] rolenames); 

現在一種方法是;

  1. 回報的角色列表
  2. 迭代每個角色和刪除具有該角色的所有用戶角色

這種方法很不高效的,我想知道是否有更好的在LINQ to SQL中處理這類問題的方法。

有什麼辦法可以在LINQ to SQL中創建一個select語句,它將採用字符串數組進行比較,而不是循環並生成N個選擇項?任何比我上面描述的更好的方法將非常感激。

表涉及:

User (RecordID, Username) 
Role (RecordID, Rolename) 
UsersInRole (RoleID,UserID) 

謝謝!

回答

4

這應該工作:

var uirQuery = from uir in db.UsersInRole 
       join u in db.User on uir.UserID equals u.RecordID 
       join r in db.Role on uir.RoleID equals r.RecordID 
       where usernames.Contains(u.Username) 
        && rolenames.Contains(r.Rolename) 
       select uir; 

db.UsersInRole.DeleteAllOnSubmit(uirQuery); 

的LINQ to SQL翻譯 「包含」 表達的T-SQL IN子句。

+0

只是爲了改進你的代碼: 我很容易在該查詢中寫出完整的單詞,以使其* far *更具可讀性:u => user,r => role,uir => usersInRole。 – 2009-08-05 16:11:52

+0

我仍然必須循環查詢每個用戶和角色? – Lukasz 2009-08-05 16:58:18

+0

否..該查詢將返回與您的方法的參數中指定的任何用戶+角色組合相匹配的所有UsersInRole記錄。您只需運行一次查詢即可獲取(或刪除,如我的示例)相關記錄。 – 2009-08-05 17:17:16