首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个OR条件的EF核心连接

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

Stack Overflow用户
提问于 2019-01-06 00:21:39
回答 3查看 6.3K关注 0票数 2

我想将这个sql查询转换为linq:

代码语言:javascript
复制
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)
            )

我试过的是:

代码语言:javascript
复制
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)

它生成这个sql查询:

代码语言:javascript
复制
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))

我也尝试过林克尔,但它不能将OR转换成linq

不能将SQL转换为LINQ:或

转换这个sql查询所必须做的事情

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-06 00:37:37

内部连接等效于筛选的交叉连接。那你觉得呢

代码语言:javascript
复制
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};
票数 5
EN

Stack Overflow用户

发布于 2019-01-06 05:37:34

我认为这个查询会有帮助。

代码语言:javascript
复制
var query = from a in context.A
            join b1 in context.B
                on new { Perimeter = a.level1, LevelID = 1 }
                equals new { Perimeter = b1.PerimeterID, LevelID = b1.PerimeterLevelID }
            join b2 in context.B
                on new { Perimeter = a.level2, LevelID = 2 }
                equals new { Perimeter = b2.PerimeterID, LevelID = b2.PerimeterLevelID }
            join b3 in context.B
                on new { Perimeter = a.level3, LevelID = 3 }
                equals new { Perimeter = b3.PerimeterID, LevelID = b3.PerimeterLevelID }
            select new
            {
                a,
                b1,
                b2,
                b3
            };
票数 1
EN

Stack Overflow用户

发布于 2019-01-06 00:36:10

你可以试试DefaultIfEmpty()。联接的行为与此命令类似于左联接。

代码语言:javascript
复制
from a in A
from b in B.DefaultIfempty()
where (   (a.level1== b.PerimeterID &&  b.PerimeterLevelID == 1)
       || (a.level2== b.PerimeterID &&  b.PerimeterLevelID == 2)
       || (a.level3== b.PerimeterID &&  b.PerimeterLevelID == 3))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54057558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档