4

テーブルをルックアップテーブルに結合したままにするデータベースのクエリを作成しようとしています。結果はcaseステートメントに基づいて返されます。

通常の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 to Entityクエリでの左結合に関するさまざまな投稿をここで見つけましたが、2つの異なるフィールドで結合する方法を理解できませんでした。これは可能ですか?

4

2 に答える 2

6

次のように、フィールド名が一致する匿名タイプに参加する必要があります。

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 {...};

fromの代わりにextraを使用した完全な実例は、次のjoinようになります。

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
            };
于 2012-01-10T14:00:47.217 に答える
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();
于 2012-01-11T11:21:51.673 に答える