我想对具有给定值的两列中的任何一列执行联接
例如,如何将以下SQL查询转换为Linq(方法语法)中的等效查询:
select f.Id fId, b.Id bId from Foo f
inner join Bar b on f.FooVal = b.BarValCol1 or f.FooVal = b.BarValCol2
我开始执行以下操作:
Context.Foos
.Join(Context.Bars, f => f.FooVal, b => b.BarValCol1 [OR?] b.BarValCol2, (f, b) => new { f, b })
.Select(bf => new { fId = bf.f.Id, bId = bf.b.Id })
(在此示例中,两列包含整数值)
答案 0 :(得分:8)
INNER JOIN
是一种更具可读性的语法,但可以将其用纯SQL转换为用WHERE
子句过滤的表的笛卡尔积。
所以我们可以简单地使用WHERE
子句并从中构建linq:
from x in Foo
from y in Bar
.Where(y => y.field1 == x.field1 || y.field2 == x.field2)
Ps:INNER JOIN
和WHERE
在SQL中不会同时求值,因此它们不是等效的。 ON
个条件过滤器INNER JOIN
然后应用WHERE
。当然,即使它们也会有相同的结果,但执行计划也不相同,这取决于数据库。
答案 1 :(得分:1)
您可以使用LINQ两次:
Context.Foos
.Join(Context.Bars, f => f.FooVal, b => b.BarValCol1, (f, b) => new { f, b })
.Select(bf => new { fId = bf.f.Id, bId = bf.b.Id }).ToList().AddRange(
Context.Foos
.Join(Context.Bars, f => f.FooVal, b => b.BarValCol2, (f, b) => new { f, b })
.Select(bf => new { fId = bf.f.Id, bId = bf.b.Id })
).Distinct();