2017-08-04 21 views
0

スタックに関するいくつかの関連する質問がありますが、私が問題を解決する方法については、テーブル左外部結合。エラーはあなたが彼らがタイプ(RoleUserRole)がマッピングされたLINQクエリで作成することができないように説明しRoleUserRoleは、エンティティオブジェクトエンティティまたは複合型 ''をLINQ to Entitiesクエリで構築することはできません.3つのテーブル外部結合

var query = from u in Context.Users 
      join ru in Context.RoleUsers on u.Id equals ru.UserId into plv 
      from x in plv.DefaultIfEmpty(new RoleUser()) 
      join r in Context.Roles on x.RoleId equals r.Id into pii 
      from y in pii.DefaultIfEmpty(new Role()) 
      orderby u.Id, y.Id 
      select new UserWithRole() { Id = u.Id, User = u, Role = y }; 
+0

タイプにあなたが得るか:あなたはIQueryable<T>結果を必要としない場合、あなたはAsEnumerable()を使用してLINQにオブジェクトコンテキストへの中間の匿名型の投影を使用して最終的な所望の投影を行うことができます

それ? 'UserWithRole'' RoleUser'または 'Role' –

+0

パラメータがない' DefaultIfEmpty() 'を使用します。使用している過負荷はサポートされていません。 –

+0

RoleUserまたはRoleの値が空の場合@IvanStoev null参照エラーが発生する –

答えて

1

です。代わりにDefaultIfEmpty()を使用してください。以下に沿って何か:

私はナビゲーションプロパティを調べることをお勧めしたいしかし
var roles = from ru in Context.RoleUsers 
      join r in Context.Roles on ru.RoleId equals r.Id 
      select new { ru.UserId, role = r }; 

var query = from u in Context.Users 
      join r in roles on u.Id equals r.UserId into plv 
      from x in plv.DefaultIfEmpty() 
      select new UserWithRole() { Id = u.Id, User = u, Role = x.role }; 

- それは「通常」のオブジェクトであるかのように、あなたが加入構築し、それに仕事をしなければならないであろうそのように。

+0

@Mo Ahmad - 次のコードではnull参照がありますか? –

+0

実際にはこれをコンパイルできませんでした\t '暗黙のうちに' <匿名型:int UserId、System.Collections.Generic.IEnumerable role> 'を' Server.Database.Role ''に変換できません。 –

+0

@MoAhmad - 真実 - 私は間違いを犯しました - 今はいかがですか? –

1

EFは定数エンティティオブジェクトの作成をSQLに変換できないため、問題はDefaultIfEmpty(new RoleUser())DefaultIfEmpty(new Role())です。

したがって、DefaultIfEmpty()のパラメータのないオーバーロードを使用し、nullオブジェクトをマテリアライズ照会結果で処理する必要があります。

var query = (from u in Context.Users 
      join ru in Context.RoleUsers on u.Id equals ru.UserId into userRoles 
      from ru in userRoles.DefaultIfEmpty() 
      join r in Context.Roles on ru.RoleId equals r.Id into roles 
      from r in roles.DefaultIfEmpty() 
      orderby u.Id, r.Id 
      select new { User = u, Role = r } 
      ) 
      .AsEnumerable() // db query ends here 
      .Select(x => new UserWithRole 
      { 
       Id = x.User.Id, 
       User = x.User, 
       Role = x.Role ?? new Role() // now this is supported 
      }); 
+0

これはほとんどのシナリオでうまくいくようですが、なぜユーザーにロールがなくてもroleuserがない場合にこのクエリーが失敗する理由はわかりません...ユーザーを返すはずですが、nullを返します。 –

関連する問題