首页 > 解决方案 > 如何从复杂的 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 (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”不在“等于”左侧的范围内

名称“DC”不在“等于”右侧的范围内

我是 LINQ 的新手,这就是我无法解决这些错误的原因。我会对上述内容提出任何建议。谢谢。

标签: c#sqllinq

解决方案


您应该像这样重新排列匿名对象中的属性:

join DSC in ctx.DocSubClasses 
on new { D.DocSubClass, DC.ID } equals new { DSC.DocClassID, DSC.ID }

右边的应该是你要加入的表(DSC),左边的可以是以前的表


推荐阅读