2016-08-23 6 views
2

ここにはこの例がありますが、正確な用語がわからないので、私はそれを見つけることができません。だから、優しくしてください。LINQでネストされた結合をエンティティに書き込む

問題は簡単なものでなければなりません:

私はやや悪い(すなわち欠落している外部キーなど)を設計し、AzureのSQLデータベースを持っています。この時点でデータベースを再設計することはできないので、クエリを使用して手動でリレーションを処理する必要があります。データベースは私たちのソフトウェアのボトルネックでもあるので、できるだけデータベースのヒット率を低くしてクエリを実行しなければなりません。 A、B、CおよびD(未登録の外部キーに接続された)Aは、いくつかのエンティティBを有するエンティティ、エンティティBは、いくつかのエンティティC及びCは、いくつかのエンティティを有するエンティティD.

を有する

私はエンティティを持っています

私はエンティティAのIDを持っており、可能な限り最適な状態で、接続されたすべてのエンティティのツリーをDsまで返すことを望みます。

オフ開始:

from A in dbA.Where(e=>e.Id==IDParameter) 
join B in dbB on A.Id equals B.AId into Bs 

私はobvoius道を行けば今、私はD.のためのCsと、再びCのためにB表示中全てのBでこれを行うとする必要があるだろう、と最初のDSとのCsに参加し、 BsとCs、そして最後にAsとBsは、すべてのDsをCsに結びつけることを意味します。そして、すべて、あなたはポイントを得て、ついにIDParameterフィルターに到達します。それは単に効果がないようです。

単一のクエリでこれを行う適切なC#の方法はありますか?

答えて

3

リレーションシップが定義されているときに、EFの機能を手動でジョインすることでシミュレートできます。必要なのはGroup Joinと投影法を使用することだけです。このような何か:私は今、私の画面を見つめてきたどのくらいの時間を教えて恥ずかしいD ...:

var result = 
    (from a in db.A 
    where a.Id == IDParameter 
    join b in db.B on a.Id equals b.AId into Bs 
    select new 
    { 
     a, 
     Bs = 
      (from b in Bs 
      join c in db.C on b.Id equals c.BId into Cs 
      select new 
      { 
       b, 
       Cs = 
        (from c in Cs 
        join d in db.D on c.Id equals d.CId into Ds 
        select new 
        { 
         c, 
         Ds = Ds.ToList() 
        }).ToList() 
      }).ToList() 
    }).ToList(); 
+1

まあ当たり前では、...それは右の私の鼻の下で全体の時間を予測しましたありがとうございました:) – JasonX

+0

追加の質問 - 私は実際に少なくとも1つのCを持っているBsを選択するだけでどうなるでしょうか? – JasonX

+0

残念ながら、グループ結合は基本的には外部結合です。しかし、結合の後で投影の前に 'Cs.Any()'を挿入することができます。 –

関連する問題