包含RIGHT OUTER JOIN与INNER JOIN的SQL转LINQ问题咨询
SQL转LINQ转换结果
关联逻辑说明
你提供的SQL执行逻辑如下:
Partitions内连接Musteriler,关联条件为两表MustKod字段相等- 上述结果内连接
HesTipleri,关联条件为Musteriler.MustTipi = HesTipleri.TipKodu - 上述结果右外连接
Hestipdetay,关联条件为Hestipdetay.TipKodu = HesTipleri.TipKodu - 上述结果右外连接
AlarmKodlari,关联条件为AlarmKodlari.AlarmKodu = Hestipdetay.RaporTanimi - 过滤条件为
Hestipdetay.raportipi = 4、Partitions.AboneNo = 399 - 最终返回
AlarmKodlari表的AlarmKodu和Tanimi字段
转换后的LINQ代码(查询语法,和SQL逻辑完全对齐)
var query = from ak in db.AlarmKodlari join htd in db.Hestipdetay on ak.AlarmKodu equals htd.RaporTanimi into akHtdGroup from htd in akHtdGroup.DefaultIfEmpty() // 实现第一个右外连接 join joinResult in ( from p in db.Partitions join m in db.Musteriler on p.MustKod equals m.MustKod join ht in db.HesTipleri on m.MustTipi equals ht.TipKodu where p.AboneNo == 399 select new { p, ht } ) on htd.TipKodu equals joinResult.ht.TipKodu into htdJoinGroup from joinResult in htdJoinGroup.DefaultIfEmpty() // 实现第二个右外连接 where htd.raportipi == 4 select new { AlarmKodu = ak.AlarmKodu, Tanimi = ak.Tanimi };
注意事项
- 因为WHERE条件中用到了
htd.raportipi == 4,会自动过滤掉Hestipdetay为null的行,实际执行效果等效于内连接,如果你需要保留无对应Hestipdetay的行,需要将过滤条件改为htd != null && htd.raportipi == 4 - 代码中的
db为你的EF/EF Core上下文实例,替换为你实际使用的变量名即可 - 最终返回的是匿名类型,你可以根据业务需要替换为自定义的实体类
内容的提问来源于stack exchange,提问作者mehmet dokuyucu
相关产品推荐
相关产品推荐

