我想在具有给定值的两列中的任何一列上执行连接
如何将以下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
Run Code Online (Sandbox Code Playgroud)
我开始做以下事情:
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 })
Run Code Online (Sandbox Code Playgroud)
(在此示例中,两列包含整数值)
INNER JOIN是一种更易读的语法,但它可以在纯SQL中翻译成用WHERE子句过滤的表的笛卡尔积.
所以我们可以简单地使用一个WHERE子句并从中构建linq:
from x in Foo
from y in Bar
.Where(y => y.field1 == x.field1 || y.field2 == x.field2)
Run Code Online (Sandbox Code Playgroud)
Ps:INNER JOIN并且WHERE不会在SQL中同时进行评估,因此它们不相同.ON条件过滤INNER JOIN然后WHERE应用.但是,即使他们将拥有相同的结果,但根据数据库当然不是相同的执行计划.