在JOIN参数中带有CASE条件的LINQ JOIN



我有一个相对简单的SQL查询,它运行良好,但不知道如何将其转换为LINQ。诀窍是JOIN中的CASE语句,并且CASE引用两个表。这是SQL

SELECT *
FROM table1 t1
INNER JOIN table2 t2 ON
t2.col1 = t1.col1
AND t2.col2 = CASE
WHEN t2.col3 = 1 THEN t1.col2
ELSE t1.col3 END

正如你所看到的,如果我在t2.col3中的bool是真的,我会在t1.col2上加入t2.col2。如果bool为false,我将在t1.col3上加入t2.col2。在SQL中,我得到了所需的结果。在LINQ中,我遇到了两个问题:第一,我似乎无法在联接(CASE(中使用三元联接,第二,我无法让LINQ联接引用联接对象中的两个表。

有没有一种干净的方法,或者任何方法可以在LINQ中完成这个SQL查询?

编辑

我尝试过的一些LINQ:

var result = from t1 in table1
join t2 in table2
on new { t1.col1, t2.col3 ? t1.col2 : t1.col3} equals
new { t2.col2, t2.col2}

在这种情况下,错误发生在三元运算的第三行,并表示t2 is not in scope on the left side of 'equals'

LINQ仅直接支持等联接。如果你想进行任何其他类型的联接,你需要一个交叉联接和where

from t1 in table1
from t2 in table2
where t1.col1 == t2.col1 && ((t2.col3 = 1 && t2.col2 = t1.col2) || (t2.col3 != 1 && t2.col2 = t1.col3))
select ..

对于这样的条件,我们需要使用where子句。

var result = from t1 in table1
join t2 in table2 on t1.col1 equals t2.col1
where t2.col2 == (t2.col3 == "1" ? t1.col2 : t1.col3)
select t2.col2;

var result2 = from t1 in table1
from t2 in table2.Where(x=>x.col2 == (x.col3 == "1" ? t1.col2 : t1.col3) &&  x.col1 == t1.col1)
select t2.col2;

最新更新