2017-07-26 11 views
0

T-SQLから来て、私はASP.Net mvc(c#)の例で基本的なデータセットを使って作業しようとしています。Linq - 結合されたテーブルのプライマリキーに結合

写真下(リンク)に示したように、私は3つのテーブルを持っている:

  1. コレクション(PK IdCollection)
  2. スプリント(PK IdSprint、FK IdCollection)
  3. DeployDocuments(PKのIdDeployDocuments、FK IdSprint私のasp.net MVCの続きで)

Table relationship diagram

ローラーは、私が見るに、この単純なクエリのLINQ同等のデータセットを渡したいと思います:

SELECT 
c.TxCollectionName 
,s.SprintNumber 
,COUNT(dd.IdDeployDocument) [NumProjects] 
FROM Collections AS c 
JOIN Sprints AS s 
    ON s.IdCollection = c.IdCollection 
LEFT JOIN DeployDocuments AS dd 
    ON dd.IdSprint = s.IdSprint 
GROUP BY 
c.TxCollectionName 
, s.SprintNumber; 

私は、私の人生のために、これを行う方法を見つけ出すことはできません! すぐに私はlinqで2番目の結合を作成しようとしました。

 var query = from Collections in db.Collections 
       join Sprints in db.Sprints on Collections.IdCollection equals Sprints.IdCollection 
       join DeployDocuments in db.DeployDocuments on DeployDocuments.IdSprint equals Sprints.IdSprint 
:私は、クエリそうのように一緒に値切るしようとしているので、今、

var CollectionSprints = db.Collections.Include(d => d.Sprints) 

しかし、私は同様にすべてのプロジェクト(deployDocuments)の合計が必要になります。

私は以前にちょうど使用していました

しかし、すぐに私が2番目の参加に落ちると、それはエラーを投げている、そこに私が読んでくださいlinqの制限はありますか?この問題を解決するために私が取るべき全く異なるアプローチがありますか?または、私はGTFOだけで、Cでもっとコースを取るべきですか?

+0

は、なぜあなたは、このためにストアドプロシージャを使用することはできません。

は、ここで私が思い付いた何ですか? LINQを使用することに決めましたか? –

+0

私は絶対にこれでストアドプロシージャを使用することができます、私はまだasp.net mvcでストアドプロシージャを使用する方法を学んでいないが、私は十分に迅速に学ぶことができると確信しています。これはlinqで実行する "複雑な"クエリですか? **編集:** 10-15行未満のクエリのストアドプロシージャを作成するのに慣れていないので、私の知覚は少し歪んでいると思いますが、それ以外の場合はSPを使用することをお勧めします。 "基本"クエリ? –

+0

LEFT JOINは複雑になります。私はそれが実行可能ではないと言っていない、ちょうどあなたのレベルでは、それはストアドプロシージャに行くことは簡単かもしれない。 –

答えて

1

Linqの左の結合は、SQLの左結合とは少し違って見えるので少し混乱するかもしれません。 This SO answerは、Linqの左結合を簡単に書く方法を示しています。 .DefaultIfEmpty()は、2番目の結合を左結合にします。

var result = (
    from c in Collections 
    from s in Sprints.Where(s => s.IdCollection == c.IdCollection) 
    from dd in DeployDocuments.Where(dd => dd.IdSprint == s.IdSprint).DefaultIfEmpty() 
    select new { c, s, dd }) 
.GroupBy(g => new { g.c.TxCollectionName, g.s.SprintNumber }) 
.Select(s => new { s.Key.TxCollectionName, s.Key.SprintNumber, NumProjects = s.Count() }; 
+0

ありがとう、私はあなたにこれを答える時間を割いていただきありがとうございます!期待どおりに動作するように見えます。しかし、それは私が私の頭の中でちょっと頭がおかしくなっていることを認識させ、おそらく単にバックペダルして、C#とデータセットに関する一般的なコースをいくつか取るべきです。再度、感謝します! –

関連する問題