Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从复杂的SQL创建LINQ?_C#_Sql_Linq - Fatal编程技术网

C# 如何从复杂的SQL创建LINQ?

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

我有以下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 (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