如何在A列或B列的Linq查询中加入

时间:2018-08-03 12:05:13

标签: c# sql .net linq

我想对具有给定值的两列中的任何一列执行联接

例如,如何将以下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 })

(在此示例中,两列包含整数值)

2 个答案:

答案 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 JOINWHERE在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();