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 = 

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 回答
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 = c.Id context.Request.Single(r => r.Id == 3)
                .Clearances.SelectMany(c => x.DocumentTypes);

实际上,得到一个且只有Request一个Id等于3,然后得到所有它DocumentTypes的所有Clearances

如果您的数据库设置了适当的外键,这些关系将作为模型的一部分自动生成。

于 2012-09-05T13:43:20.803 回答