3

テーブルをルックアップテーブルに結合したままにするデータベースのクエリを書き込もうとしていて、結果がcaseステートメントに基づいて返されます。EFケースステートメントと組み合わせた2つのプロパティのテーブルへの結合を残しました

通常のSQLでクエリは次のようになります。

SELECT chis_id, chis_detail, cilt.mhcatID, cilt.mhtID, 'TheFileName' = 
CASE 
    WHEN cilt.mhcatID IS NOT NULL AND cilt.mhtID IS NOT NULL THEN chis_linked_filename 
    END 
FROM chis 
    LEFT JOIN cilt on cilt.mhcatID = chis.mhcat_id AND cilt.mhtID = chis.mht_id 
WHERE cch_id = 50 

chisテーブルが照会され、ciltは、ルックアップテーブルで、(CHIS結果としてCHISへの外部キー関係が含まれていませんmhtIDとmhcatIDでそれぞれmhtテーブルとmhcatテーブルに既存のFKを持っています)。

このクエリは、レコードの履歴更新のリストを返すために使用されます。 ciltルックアップテーブルへの結合が成功した場合、これは、クエリの呼び出し元に、履歴更新のための関連ファイルのファイル名を表示する権限があることを意味します。

私の研究の中で、ケースステートメントを実行する方法と、Linqのエンティティクエリへの結合を放棄する方法に関するさまざまな記事がありましたが、2つの異なるフィールドにどのように参加するかを検討することができませんでした。これは可能ですか?

答えて

5

あなたがそうのように一致するフィールド名を匿名型に加入する必要があります。

var query = from x in context.Table1 
      join y in context.Table2 
      on new { x.Field1, x.Field2 } equals new { y.Field1, y.Field2 } 
      select {...}; 

代わりjoinの余分fromを使用して、完全な作業例は、このようなものになります。

var query = from chis in context.Chis 
      from clit in context.Clit 
           .Where(x => x.mhcatID = chis.mhcat_id) 
           .Where(x => x.mhtID = chis.mht_id) 
           .DefaultIfEmpty() 
      select new 
      { 
       chis.id, 
       chis.detail, 
       cilt.mhcatID, 
       cilt.mhtID, 
       TheFileName = (cilt.mhcatID != null && cilt.mhtID != null) ? chis.linked_filename : null 
      }; 
+0

は、任意のパフォーマンスの問題や「から」を使用してソリューションを匿名より悪い/良いだろう理由があります型メソッド? – GrandMasterFlush

+0

@ GrandMasterFlush - 私の経験から、生成されたSQLは両方のメソッドで同じなので、どのオプションを簡単に見つけるかを選択します。 – Aducci

+0

私は結果をチェックしていますが、これは内部結合としてデータベースに渡され、左結合ではありません。次のクエリを簡素化しても、まだ内部結合として処理されています。 var query = context.chisのxから context.ciltsのYに結合します。new {MHT = x.mht_id}はnew {MHT = y.mhtID} x.cch_id == 50 select x.chis_id; – GrandMasterFlush

1

Aducciの示唆に基づいて、グループ結合とDefaultIsEmpty()を使用して、私が望む結果を得ることができました。何らかの理由で、DefaultIfEmpty()がそれ自身で正しく動作せず、結果として生じるSQLが左辺の代わりに内部結合を使用するようになりました。

ここで私は左が作業に参加取得するために使用される最終的なコードです:関心のうち

var query = (from chis in context.chis 
      join cilt in context.cilts on new { MHT = chis.mht_id, MHTCAT = chis.mhcat_id } equals new { MHT = cilt.mhtID, MHTCAT = cilt.mhcatID } into tempCilts 
      from tempCilt in tempCilts.DefaultIfEmpty() 
      where chis.cch_id == 50 
      select new { 
          chisID = chis.chis_id, 
          detail = chis.chis_detail, 
          filename = chis.chis_linked_filename, 
          TheFileName = (tempCilt.mhcatID != null && tempCilt.mhtID != null ? chis.chis_linked_filename : null), 
           mhtID = chis.mht_id, 
           mhtcatID = chis.mhcat_id 
         }).ToList(); 
関連する問題