我在将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()
....