将 SQL 查询转换为 LINQ -- 运算符'&&'不能应用于类型为 'int' 和 'bool' 的操作数



我在将SQL查询转换为LINQ时遇到问题。我想我已经将其中的 95% 复制到 LINQ 中,但是在联接时遇到问题

.SQL

SELECT 
    table1.Column1 
FROM 
    table 1 table1 
LEFT OUTER JOIN 
    table 2 table2 ON table2.Column1 = table1.Column1 
                   AND table2.Column2 = 1838 
WHERE 
    table1.Column2 = 1 
    AND table1.Column3 = 24029 
    AND (table2.[Column3] IS NULL OR table2.[Column3] = 1)

到目前为止的 LINQ

var query = from table1 in table 1
            join table2 in table 2 on table1.Column1 equals table2.Column1 && table2.Column2 == 1838 into result
            from table2 in result.DefaultIfEmpty()
            where table1.Column2 == 1 && table1.Column3 == 24029 && (table2.Column3 == null || table2.Column3 == 1)
            select table1.Column1;

当我运行查询时,我在此行收到错误

join table2 in table 2 on table1.Column1 equals table2.Column1 && tabl2.Column2 == 1838 into result

错误:

CS0019 运算符"&&"不能应用于类型为"int"和"bool"的操作数

有什么建议吗?

复合键连接的 LINQ 语法是不同的。所以而不是不正确

join table2 in table_2 on table1.Column1 equals table2.Column1 && table2.Column2 == 1838 into result

你可以使用这样的东西

join table2 in table_2
on new { table1.Column1, Column2 = 1838 } equals new { table2.Column1, table2.Column2 }
into result

Linq 在连接 on 子句方面比 SQL 更严格。 基本上,它将equals一侧的东西与另一侧的东西进行比较。 equals不像==,你不能用逻辑运算符将更多的逻辑链接到最后。 最好的方法是将构成表之间关系的列放入连接的 on 子句中。

join table2 in table_2 on table1.Column1 equals table2.Column1 into result

然后将table2.Column2 == 1838移到where

where table2.Column2 == 1838
      && table1.Column2 == 1 
      && table1.Column3 == 24029 
      && (table2.Column3 == null || table2.Column3 == 1)

或者,这也行得通,但实际上不是最佳实践。

join table2 in table_2 
on new {table1.Column1, Column2 = 1838} 
equals new {table2.Column1, table2.Column2 } into result

因为这是您进行多重比较的方式,但请注意,它只会与允许您执行任何类型的逻辑子句的 SQL 不同。

或者,如果使用 EF 并且表具有外键关系,则应具有导航属性,并且可以执行以下操作

from table1 in table_1
from table2 in table1.table_2s.DefaultIfEmpty()
.... 

最新更新