2009-08-05 20 views
1

データアクセスのためにLINQ to SQLを使用してカスタムロールプロバイダを作成したところです。プロバイダに書き込む必要がある関数の1つは、ユーザーをロールから削除することです。LINQ to SQL多対多の比較クエリ

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

ここで1つのアプローチがあります。よりよいがある場合

  • 役割ごとに反復してその役割を持っているすべてのユーザからその役割を削除するには
  • このアプローチは、効率的ほど遠いロールのリストは、私が希望

    1. リターンを知っていますLINQ to SQLのこの種の問題を処理する方法。

      LINQ to SQLにループしてN個の選択を行う代わりに、比較のために文字列配列を取るselect文を作成する方法はありますか?私が上で説明したものより良いアプローチは、大いに感謝されるでしょう。関与

      テーブル:

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

      ありがとうございました!

    答えて

    4

    これは動作するはずです:SQLへ

    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は、IN句T-SQLに "入って" という表現を変換します。

    +0

    あなたのコードを改善するだけです: 私は、* far *より読みやすいように、その質問に完全な単語を簡単に書きます:u => user、r => role、uir => usersInRole。 –

    +0

    私はまだこのクエリを各ユーザーとロールごとにループする必要がありますか? – Lukasz

    +0

    いいえ。このクエリは、メソッドの引数で指定されたuser + roleの任意の組み合わせに一致するすべてのUsersInRoleレコードを返します。関連するレコードを取得する(または削除する)ためにクエリを1回だけ実行します。 –