1

私はlinqのスターターです。このT-SQLクエリを書いています

select * from DOCUMENT_TYPES where document_id in(
select document_id from Clearance_Document where Clearance_id=(select clearance_id from clearance_id from request where request_id=3)) 

この T-SQL クエリを linq に変換したいのですが、助けてください、ありがとう

4

4 に答える 4

3

まず、ネストされたサブクエリのチェーン以外のものに SQL をリファクタリングすることから始めます。これは同じことをするべきだと思います、そしてそれははるかに読みやすいです:

SELECT
    *
FROM
    DOCUMENT_TYPES dt
JOIN
    Clearance_Document cd
    ON
    dt.document_id = cd.document_id
JOIN
    Request r
    ON
    cd.clearance_id = r.clearance_id
WHERE 
    r.request_id = 3

(from clearance_id from requestタイプミスだったと思います。)

次に、LINQ ステートメントに簡単にリファクタリングできます。

var result = from dt in DOCUMENT_TYPES
             join cd in Clearance_Document on dt.document_id equals cd.document_id
             join r in Request on cd.clearance_id equals r.clearance_id
             where r.request_id = 3
             select new {
                property1 = dt.something,
                property2 = cd.somethingElse,
                ...
             };
于 2012-09-05T13:35:09.140 に答える
1

どうですか

var result = c.Id context.Request.Single(r => r.Id == 3)
                .Clearances.SelectMany(c => x.DocumentTypes);

事実上、に等しいものだけRequestを取得してから、そのすべてのすべてを取得します。Id3DocumentTypesClearances

データベースが適切な外部キーで設定されている場合、これらの関係はモデルの一部として自動的に生成されます。

于 2012-09-05T13:43:20.803 に答える
1

そのようなことを行う必要があります(EFを使用していると思いますが、他のLinQタイプに簡単に適応できます):

context.Document_Types.Where(doc => 
  conext.Clearance_Document.Where(cd => 
    cd.Clearance_Id == context.Request.Single(r => r.Request_Id == 3)
  ).Contains(doc.Document_Id)
).ToList();
于 2012-09-05T13:34:16.800 に答える
1
var result = 

from  a in DOCUMENT_TYPES 
let list = 
(
from b in Clearance_Document 
where b.Clearance_id ==  (from c in clearance_id where  request_id == 3).First<string>())
select b
).ToList()

where list.Contains(a.document_id) 

select a;
于 2012-09-05T13:33:13.853 に答える