C# 如何将T-SQL查询转换为linq
我在SQL中有4个表:C# 如何将T-SQL查询转换为linq,c#,linq,entity-framework,C#,Linq,Entity Framework,我在SQL中有4个表:DocumentType,ClearanceDocument,Request,RequestDocument 我希望当页面加载和用户选择一个请求时,在RequestTable中显示基于clearanceType的所有文档,并签入RequestDocument,当存在时设置是否存在=true 我已使用SqlServer查询编辑器编写了此查询,以获取此场景的结果,但无法将此查询转换为Linq select *, is_Orginal= (select i
DocumentType
,ClearanceDocument
,Request
,RequestDocument
我希望当页面加载和用户选择一个请求时,在
RequestTable
中显示基于clearanceType
的所有文档,并签入RequestDocument
,当存在时设置是否存在=true
我已使用SqlServer查询编辑器编写了此查询,以获取此场景的结果,但无法将此查询转换为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
。请帮帮我。谢谢。无需手动连接从实体框架上下文返回的对象
看
如果您按照预期使用该框架,您的工作将更加轻松
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
});
由于在遍历数据之前不会执行查询,因此可以将查询拆分为多个子查询,以帮助您获得如下结果:
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();
@M.B.:到底什么不起作用?您是否遇到编译器错误?运行时异常?意外结果?@M.B.-抱歉,我编辑了这篇文章,你发布的后面部分已经不见了。你能把它再说一遍吗?我的错。@Shaks:np,我编辑了问题并添加了我的linq代码。请用简单的英语解释查询应该返回什么。SQL返回文档类型。*
,并且的位是原始的
,但是您的linq尝试从一系列对象返回属性。他们完全不同。@柯克·布罗德赫斯特:谢谢你的帮助,但清关请求和清关文件之间没有关系。请求仅与许可证\u请求\u文件有关系