C# 如何从复杂的SQL创建LINQ?
我有以下SQL查询:C# 如何从复杂的SQL创建LINQ?,c#,sql,linq,C#,Sql,Linq,我有以下SQL查询: SELECT D.ID FROM Documents AS D INNER JOIN DocClasses AS DC WITH (NOLOCK) ON D.DocClass = DC.ID INNER JOIN DocSubClasses AS DSC WITH (NOLOCK) ON D.DocSubClass = DSC.ID AND DSC.DocClassID = DC.ID INNER JOIN DocPathFolders AS F WITH
SELECT D.ID
FROM Documents AS D
INNER JOIN DocClasses AS DC WITH (NOLOCK)
ON D.DocClass = DC.ID
INNER JOIN DocSubClasses AS DSC WITH (NOLOCK)
ON D.DocSubClass = DSC.ID AND DSC.DocClassID = DC.ID
INNER JOIN DocPathFolders AS F WITH (NOLOCK)
ON D.DocPathFolderID = F.ID
WHERE
DC.ShortName = 'PAY' AND DSC.Name = 'xxxxx'
AND UPPER(F.Description) = 'READY TO SEND'
我正在尝试将此查询转换为LINQ。以下是我迄今为止所做的工作:
from D in ctx.Documents
join DC in ctx.DocClasses on D.DocClass equals DC.ID
join DSC in ctx.DocSubClasses
on new { D.DocSubClass, DSC.DocClassID } equals new { DSC.ID, DC.ID }
join F in ctx.DocPathFolders
on D.DocPathFolderID equals F.ID
where
DC.ShortName == "PAY"
&& DSC.Name == "xxxxx"
&& (F.Description).ToUpper() == "READY TO SEND"
select D.ID;
我在这行中遇到了错误:
join DSC in ctx.DocSubClasses on new { D.DocSubClass, DSC.DocClassID } equals new { DSC.ID, DC.ID }
在这里,我得到以下错误:
名称“DSC”不在“equals”左侧的范围内
名称“DC”不在“equals”右侧的范围内
我是LINQ的新手,这就是为什么我不能解决这些错误。我愿意听取关于上述问题的任何建议。谢谢。以下是我解决问题的方法:
from D in ctx.Documents
join DC in ctx.DocClasses on D.DocClass equals DC.ID
join DSC in ctx.DocSubClasses on new { D.DocSubClass, DC.ID } equals new { DocSubClass = DSC.ID, ID = DSC.DocClassID }
join F in ctx.DocPathFolders on D.DocPathFolderID equals F.ID
where DC.ShortName == "PAY" && DSC.Name == "xxxx" && (F.Description).ToUpper() == "READY TO SEND"
select D.ID;
您应该重新排列匿名对象中的属性,如下所示:
join DSC in ctx.DocSubClasses
on new { D.DocSubClass, DC.ID } equals new { DSC.DocClassID, DSC.ID }
右边的应该是您要加入的表(
DSC
),左边的可以是以前的表只要将DSC切换到equals的右边,将DC切换到左边,它就可以正常工作了
join DSC in ctx.DocSubClasses on new { D.DocSubClass, DC.ID } equals new { DSC.ID, DSC.DocClassID}
提示:如果您在数据库中正确设置了关系,您几乎不需要使用“join”。用LINQ编写更容易,关系作为“导航属性”公开。您只需使用“点符号”。即: 注意:我们对您的型号没有任何想法。我假设这种关系是一对多的。如果是多对1,那么您只需使用如下符号:
where d.DocClass.ShortName == "PAY"
&& d.DocClass.DocSubClass.Name == "xxxxx"
&& d.DocPathFolder.Description.ToUpper() == "READY TO SEND"
HINT2:从Linqpad.net下载并开始使用Linqpad。这是一个很好的工具,您不仅可以测试LINQ查询,还可以将其用作.Net记事本。您可以尝试使用
Lambda
而不是LINQ
在Lambda
中,您的JOIN
语句如下所示
#
比较错误的值,因为
ID
和DocSubClass
未与相同的属性名称进行比较。您必须更改任一匿名类中的属性名称(将其切换)
where d.DocClass.ShortName == "PAY"
&& d.DocClass.DocSubClass.Name == "xxxxx"
&& d.DocPathFolder.Description.ToUpper() == "READY TO SEND"
var result = ctx.Documents.Join(ctx.DocClasses , d => new { Id = d.DocClass }, dc => new { Id = dc.ID }, (d, dc) => new { doc = d, docClass = dc }) //INNER JOIN DocClasses
.Join(ctx.DocSubClasses , d => new { sc = d.doc.DocSubClass, Id = d.docClass.ID }, dsc => new { sc = dsc.ID, Id = dsc.DocClassID }, (d, dsc) => new { doc = d, dsc = dsc } ) //INNER JOIN DocSubClasses
.Join(ctx.DocPathFolders, d => new { fId = d.doc.doc.DocPathFolderID }, f => new { fId = f.ID }, (d, f) => new { doc = d, f = f }) //INNER JOIN DocPathFolders
.Where(x => x.doc.doc.docClass.ShortName == "PAY" && x.doc.dsc.Name == "xxxxx" && x.f.Description.ToUpper() == "READY TO SEND")//Apply where clause
.Select(y => y.doc.doc.doc.ID);//Select whatever you want