2009-08-05 109 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