具有多个 OR 条件的 EF 核心连接

Oma*_*OUG 2 c# linq sql-server c#-6.0 ef-core-2.1

我想将此 sql 查询转换为 linq :

select * from  A a
join B b on (    (a.level1= b.PerimeterID and  b.PerimeterLevelID = 1)
              OR (a.level2= b.PerimeterID and  b.PerimeterLevelID = 2)
              OR (a.level3= b.PerimeterID and  b.PerimeterLevelID = 3)
            )
Run Code Online (Sandbox Code Playgroud)

我试过的:

from a in A
join b in B on new {PerimeterID = a.level1, PerimeterLevelID = 1 } equals new { b.PerimeterID, b.PerimeterLevelID }
where (a.level2 == b.PerimeterID && b.PerimeterLevelID == 2) ||
      (a.level3 == b.PerimeterID && b.PerimeterLevelID == 3)
Run Code Online (Sandbox Code Playgroud)

它生成这个 sql 查询:

select * from  A a
join B b on (a.level1= b.PerimeterID and  b.PerimeterLevelID = 1)
where (a.level2= b.PerimeterID and  b.PerimeterLevelID = 2)
       OR (a.level3= b.PerimeterID and  b.PerimeterLevelID = 3))
Run Code Online (Sandbox Code Playgroud)

我也试过Linqer但它不能将 OR 转换为 linq

SQL 无法转换为 LINQ:或

我必须做些什么来转换这个 sql 查询

Dav*_*oft 5

内部联接等效于过滤的交叉联接。那么怎么样

from a in A
from b in B 
where (a.level1 == b.PerimeterID && b.PerimeterLevelID == 1) ||
      (a.level2 == b.PerimeterID && b.PerimeterLevelID == 2) ||
      (a.level3 == b.PerimeterID && b.PerimeterLevelID == 3)
select new {a,b};
Run Code Online (Sandbox Code Playgroud)

?

  • 带有 WHERE 子句的 CROSS JOIN 在语义和(至少在 SQL Server 中)性能方面与 INNER JOIN 相同。 (2认同)