2

SQLに4つのテーブルがあります:DocumentType、、、。 ページの読み込みとユーザーが1つのリクエストを選択し、すべてのドキュメントに基づいて表示し、チェックインして設定したときに欲しいClearanceDocumentRequestRequestDocument
clearanceTypeRequestTableRequestDocumentexistis_exist=true

このシナリオで結果を取得するためにこのクエリを記述しSqlServer Query Editorましたが、このクエリをLinqに変換できません

    select *,
    is_Orginal=
    (select is_orginal from CLEARANCE_REQUEST_DOCUMENT 
    where 
    DOCUMENT_ID=a.DOCUMENT_ID and REQUEST_ID=3)
    from 
    DOCUMENT_TYPES a
    where 
    DOCUMENT_ID in 
    (select DOCUMENT_ID from CLEARANCE_DOCUMENTS dt 
    where 
    dt.CLEARANCE_ID=
    (SELECT R.CLEARANCE_TYPE FROM CLEARANCE_REQUEST R 
    WHERE 
    R.REQUEST_ID=3)) 

このクエリをlinqで記述しましたが、機能しません

 var list = (from r in context.CLEARANCE_REQUEST
                        where r.REQUEST_ID == 3
                        join cd in context.CLEARANCE_DOCUMENTS on r.CLEARANCE_TYPE equals cd.CLEARANCE_ID
                        join dt in context.DOCUMENT_TYPES on cd.DOCUMENT_ID equals dt.DOCUMENT_ID into outer
                        from t in outer.DefaultIfEmpty()
                        select new
                                   {
                                        r.REQUEST_ID,
                                        cd.CLEARANCE_ID,
                                        t.DOCUMENT_ID,
                                        t.DOCUMENT_NAME,
                                        is_set=(from b in context.CLEARANCE_REQUEST_DOCUMENT where 
                                                    b.REQUEST_ID==r.REQUEST_ID && b.DOCUMENT_ID==t.DOCUMENT_ID
                                                    select new{b.IS_ORGINAL})
                                   }

                       ).ToList();

このクエリをに変換したいLINQ。私を助けてください。ありがとう。

4

2 に答える 2

1

EntityFrameworkコンテキストから返されたオブジェクトを手動で結合する必要はありません。

単純な1対多の関係でLINQ結合を使用する理由を参照してください。

意図したとおりにフレームワークを使用すると、作業がはるかに簡単になります。

var result = var clearanceTypes = context.CLEARANCE_REQUEST
    .Single(r => r.REQUEST_ID == 3)
    .CLEARANCE_DOCUMENTS
    .SelectMany(dt => dt.DOCUMENT_TYPES)
    .Select(a => new 
    {
        DocumentType = a,
        IsOriginal = a.CLEARANCE_REQUEST_DOCUMENT.is_original
    });
于 2012-09-06T06:41:07.900 に答える
1

データを反復処理するまでクエリは実行されないため、クエリをいくつかのサブクエリに分割して、次のような結果を得ることができます。

var clearanceIds = context.CLEARANCE_REQUEST
                          .Where(r => r.REQUEST_ID == 3)
                          .Select(r => r.CLEARANCE_TYPE);
var documentIds = context.CLEARANCE_DOCUMENTS
                         .Where(dt => clearanceIds.Contains(dt.CLEARANCE_ID))
                         .Select(dt => dt.DOCUMENT_ID);
var result = context.DOCUMENT_TYPES
                    .Where(a => documentIds.Contains(a.DOCUMENT_ID))
                    .Select(a => new
                    {
                        // Populate properties here
                        IsOriginal = context.CLEARANCE_REQUEST_DOCUMENT
                                            .Single(item => item.DOCUMENT_ID == a.DOCUMENT_ID &&
                                                              item.REQUEST_ID == 3)
                                            .IS_ORIGINAL
                    })
                    .ToList();
于 2012-09-06T06:42:34.133 に答える