2016-12-22 8 views
0

新しいプロジェクトでEntity Frameworkを使用して、有効かどうかを確認します。Transform SQL Select Entity Frameworkに5つのテーブルを結合します

しかし、私は5つのテーブルを結合する必要がある部分にこだわってしまった。私は彼らの関係が大丈夫だと確信しています。私は.Include(x => x.table)を3つだけ選択することができます(私はインターネット上で見つけたので)、私はJoin()を使う必要があると知っています。

SQLのSELECTは、次のとおりです。

SELECT  
    Module.* 
FROM    
    UserGroup as ug 
INNER JOIN 
    Group as g ON ug.IdGroup = g.IdGroup 
INNER JOIN 
    GroupFunctionality as gf ON g.IdGroup = gf.IdGroup 
INNER JOIN 
    Functionality as f ON gf.IdFunctionality = f.IdFunctionality 
INNER JOIN 
    Screen as s ON f.IdScreen = s.IdScreen 
INNER JOIN 
    Module as m ON s.IdModule = m.IdModule 
WHERE 
    ug.IdUser = 1 
+0

あなたはクエリをビューにしてEFにインポートすることを検討しましたか?これは、より迅速でより保守性の高いソリューションです。 – Seano666

答えて

0

エンティティへのLINQを使用してDbSetコンテキストプロパティ名を想定したテーブル名と同じであり、ここではC#の式を使用したクエリは次のとおりです。

from ug in db.UserGroup 
join g in db.Group on ug.IdGroup equals g.IdGroup 
join gf in db.GroupFuncionality on g.IdGroup equals gf.IdGroup 
join f in db.Funcionality on gf.IdFuncionality equals f.IdFuncionality 
join s in db.Screen on f.IdScreen equals s.IdScreen 
join m in db.Module on s.IdModule equals m.IdModule 
where ug.IdUser == 1 
select m 

あなたの場合ラムダ式でJoinメソッドを使用したい場合、ここでは複数の結合構文が使用されます(上記の構文をLINQPadで変換したもの):

db.UserGroup.Join(db.Group, ug => ug.IdGroup, g => g.IdGroup, (ug, g) => new { ug = ug, g = g }) 
      .Join(db.GroupFuncionality, temp0 => temp0.g.IdGroup, gf => gf.IdGroup, (temp0, gf) => new {temp0 = temp0, gf = gf}) 
      .Join(db.Funcionality, temp1 => temp1.gf.IdFuncionality, f => f.IdFuncionality, (temp1, f) => new {temp1 = temp1, f = f}) 
      .Join(db.Screen, temp2 => temp2.f.IdScreen, s => s.IdScreen, (temp2, s) => new {temp2 = temp2, s = s}) 
      .Join(db.Module, temp3 => temp3.s.IdModule, m => m.IdModule, (temp3, m) => new {temp3 = temp3, m = m}) 
      .Where(temp4 => temp4.temp3.temp2.temp1.temp0.ug.IdUser == 1) 
      .Select(temp4 => temp4.m) 

CMIIW。

関連する問題