在LINQ中实现多条件联合主键LEFTJOIN
我昨天遇到⼀个LINQ下使⽤多条件⽐对产⽣LEFT JOIN的问题,经过深⼊研究,终于解决了,也让我学到了新的东西,特地拿来分享。
实例:有⼀张库存异常变更视图KCYD,仓库ID[Ckid]和物品ID[SpxxId]是该视图的唯⼀约束。有⼀张物品表ITEM,物品ID[ITEM_ID]是主键。还有⼀张表是统计正品和次品库存数量的视图SPKC,仓库ID[CKID]和物品ID[SPXXID]是该视图的唯⼀约束。现在的要求是根据条件查询库存异常变更的物品信息,即要求KCYD左联ITEM再左联SPKC。KCYD和ITEM的公共字段是物品ID,KCYD和SPKC的公共字段是仓库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语句,KCYD和ITEM表是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.KCYDsql left join 多表连接
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
{
... ...
};
⼤功告成!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论