2012-03-01 16 views
1

私はLinqに変換する必要がある完全に機能するSQLクエリを持っています。すべてのレコードを1つのテーブルに戻し、それを2番目のテーブルに追加する必要があります。私は、2番目のテーブルの特定のフィールドの値が変数値(下の例では75)と等しい、またはnullを返す2番目のテーブルの結果と結合された最初のテーブルの結果をすべて返す必要があります。SQLからLinqへSQL結合ステートメントで 'AND'で左結合

したがって、結果の行の総数は、table1からの行の合計数にする必要があります。 table2からの結合からの行の部分は、レコードが存在するtable2の値を75の値で表示するか、レコードが存在しない場合はnullを表示する必要があります。

編集:t1.field1はintであり、t2.field1はnullable intです。

私は複数のlinq文を試し、結合をグループ化し、同僚に尋ねて、私の目がにぎやかになった。私は立ち往生している。私は私の質問の文言がはっきりしないかもしれないことに気付き、そうでなければ事前に謝罪します。

ありがとうございます。 クリス

SQLクエリ:

SELECT * 
FROM table1 AS t1 LEFT OUTER JOIN 
table2 AS t2 ON t1.field1 = t2.field1 AND t2.field2 = 75 
+1

[単一結合の複数のフィールドでLINQの結合を行う方法](http://stackoverflow.com/questions/373541/how-to-do-joins-in-linq-on-multiple-fields -in-single-join) –

+0

質問をする前に検索を行ってください。ネット上には数十のサンプルがあります。 – arunes

+0

ネットには多くの例があります。残念ながら、それらは私のために働いていません。それは、intをnull値のintまたはnull可能なintと、テーブルフィールドではないintである整数と比較する必要があるかもしれません。しかし、私を信じて、私は私の研究をしました。 – Chris

答えて

0

使用DefaultIfEmpty -

に動作しますが、私は期待したいほどエレガントではない答えをこれを達成する方法のサンプルについてはLINQ - Left Join, Group By, and Counthttp://msdn.microsoft.com/en-us/library/bb397895.aspxを見ます:

var q = from item1 in table1 
      join item2 in table2 on new { Field1=(int?)item1.Field1, Field2=75 } 
        equals new { item2.Field1, item2.Field2 } into gj 
      from subItem2 in gj.DefaultIfEmpty() 
      select new { F1= item1.Field1, F2 = (subItem2 == null ? string.Empty : subItem2.Field2.ToString()) }; 

Where節が(Field2 = 75)に収まるように見えなかったので、代わりにテーブル間の複合キーは、同じ効果を達成する。

醜さの第2ビットがNULL可能でint型へのキャストであるためか、複合キーでフィールド1、それはテーブルの上に対応するフィールドと同一視することができますので、2

明らかに、あなたは「あなた値どんな匿名型で返しますあなたが2番目のテーブルから返されるものを見ることができるように、Field2の文字列表現を示した理由でnullを返すことはできないことに注意してください。

+0

ご意見ありがとうございます。DefaultIfEmptyは通常の左/右結合を行うのに最適ですが、nullまたは75のIDしか持たないtable2行が必要な場合でも、table2がnullでない行だけを返します。 – Chris

+0

作業中の(少し醜い)例の更新された回答を表示 – kaj

0

ありがとうございました。私はいくつかのnullが必要ですが、特定のIDがnullで、すべての値がnullでないものだけが必要なので、上記の解決法はどれも動作しません。可能な場合は、linqでこれを行うことは非常に難しいと思われます。

私は、時間のために働いていたSQLクエリを取得し、ストアドプロシージャと関数インポートにすることにしました。私はそれが正しい方法ではないように感じますが、時間は常に要因です。

ご回答いただきありがとうございます。

+0

答えとしてマークすることができます。 –