2012-03-02 20 views
1

I持っSQLで次の表:- 多くの関係に多くと - VB.NET

ユーザー(ユーザーID、電子メール) 役割(RoleID、ロール名) UsersInRoles(ユーザーID、RoleID)

すべてのロールのリストと、そのロールが特定のユーザーに割り当てられているかどうかを示すフィールドを戻したいとします。

私は以下のクエリを使用してこれを行うだろうSQLで

SELECT R.RoleID, RoleName, CASE WHEN ISNULL(UIR.UserID, 0) = 0 THEN 0 ELSE 1 END 
FROM Roles R 
LEFT JOIN UsersInRoles UIR ON R.RoleID = UIR.RoleID AND UserID = 2 

私のエンティティモデルはUsersInRolesテーブルを隠し、代わりに2をリンクするユーザーおよびロールの各エンティティのナビゲーションプロパティを作成します。

同様のLINQ to Entityクエリーを作成しようとしていますが、できませんでした。

お手伝いできますか?

答えて

0

実行しようとしているのは、LINQによる外部結合です。

あなたはここに例を見つけることができます:ここでは
http://www.hookedonlinq.com/OuterJoinSample.ashx

は、あなたがあなたのケースでそれを行うだろうかです:クエリで

var query = from r in db.Roles 
      from u in db.Users 
      join uir in u.Roles on r.RoleID equals uir.RoleID into outer 
      from o in outer.DefaultIfEmpty() 
      where u.UserID == 2 
      select new 
      { 
       RoleID = r.RoleID, 
       RoleName = r.RoleName, 
       IsInRole = (o != null) 
      } 

UPDATE

  • エラーを修正
+0

私は – user1244893

0

あなたが興味のある分野含んanonymous typesEnumerable.Select方法プロジェクトロールのリストを使用することができます:あなたはサブクエリを避けたい場合には

Dim results = roles.Select(Function(r) New With _ 
    { _ 
     .Id = r.RoleId, _ 
     .Name = r.RoleName, _ 
     .IsAssigned = r.Users.Any(Function(u) u.UserId = 2) _ 
    } 

を、あなたは、左外部結合を表現することができLINQで:

Dim results = From r In roles 
       Group Join u In users On r.RoleId Equals u.RoleId 
       Into assignedUsers = Group _ 
       From au In assignedUsers.DefaultIfEmpty() 
       Select New With _ 
       { _ 
        .Id = r.RoleId, _ 
        .Name = r.RoleName, _ 
        .IsAssigned = If(au Is Nothing, False, au.UserId = 2) _ 
       } 
+0

作品偉大VB.NETが、運...でこれを複製しようとしたが、これはそれぞれの役割のためにサブクエリを実行します。 – ntziolis

+0

@ntziolis本当ですか? Entity Frameworkは、そのようなLINQ式をSQL結合に変換するほどスマートです。 SQLプロファイラや[Entity Framework Profiler](http://efprof.com)などでアプリケーションをプロファイリングしてみてください。 –

+0

ちょうどLINQPad経由でもう一度チェックされ、結果のSQLは期待通りに 'EXISTS'サブクエリを使用しています – ntziolis