在LINQ中实现多条件联合主键LEFT JOIN

我昨天遇到一个LINQ下使用多条件比对产生LEFT JOIN的问题,经过深入研究,终于解决了,也让我学到了新的东西,特地拿来分享。

实例:有一张库存异常变更视图KCYD,仓库ID[Ckid]和物品ID[SpxxId]是该视图的唯一约束。有一张物品表ITEM,物品ID[ITEM_ID]是主键。还有一张表是统计正品和次品库存数量的视图SPKC,仓库ID[CKID]和物品ID[SPXXID]是该视图的唯一约束。现在的要求是根据条件查询库存异常变更的物品信息,即要求KCYD左联ITEM再左联SPKCKCYDITEM的公共字段是物品IDKCYDSPKC的公共字段是仓库ID和物品ID

我原先想到的写法如下:

 var query = from k in DBContext.KCYD
             join i in DBContext.ITEM
             on k.SPXXID equals i.ITEM_ID into g
             from gc in g.DefaultIfEmpty()
             join s in DBContext.SPKC
             on k.SpxxId equals s.SPXXID into g1
             from gc1 in g1.DefaultIfEmpty()
             where k.Ckid == gc1.CKID
             select new
             {
                 ... ...                            
             };

但是生成的SQL语句,KCYDITEM表是LEFT OUTER JOIN的,但是联SPKC表却变成了INNER JOIN,这是为啥呢,经过一番折腾下来,发现问题出在where k.Ckid == gc1.CKID,如果把这个条件去掉的话,那就成了LEFT OUTER JOIN了,然后我就在想这个条件应该放在哪呢,LINQ里面到底支不支持联合主键的问题呢,在网上搜了半天,发现可以用 on new {字段1,字段2} equals new {字段1,字段2} into g的方法,于是修改代码如下:

 var query = from k in DBContext.KCYD
             join i in DBContext.ITEM
             on k.SPXXID equals i.ITEM_ID into g
             from gc in g.DefaultIfEmpty()
             join s in DBContext.SPKC
             on new {k.SpxxId,k.Ckid} equals new {s.SPXXID,s.CKID} into g1
             from gc1 in g1.DefaultIfEmpty()
             select new
             {
                 ... ...                            
             };

但是很不给力的是这样居然提示错误:The type arguments cannot be inferred from the query.
简直就是杯具,难道LINQ不支持这样搞?唉,在我绝望的时候同事为我看出了端倪,原来equals两边的参数字段名的大小写必须完全匹配。即完整代码如下:

 var query = from k in DBContext.KCYD
             join i in DBContext.ITEM
             on k.SPXXID equals i.ITEM_ID into g
             from gc in g.DefaultIfEmpty()
             join s in DBContext.SPKC
             on new {SPXXID=k.SpxxId,CKID=k.Ckid} equals new {s.SPXXID,s.CKID} into g1
             from gc1 in g1.DefaultIfEmpty()
             select new
             {
                 ... ...                            
             };

大功告成!

posted on   itjeff  阅读(545)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示