Linq左连接查询where子句报错,如何修正该查询语句?
问题分析与修复方案
哦,我一眼就瞅出问题所在了——你在左连接之后错误地引用了变量b,但实际上左连接的结果应该用你定义的z变量啊!
为什么原代码报错?
在你的LINQ查询里,join b in dt2... into y这一步之后,b这个变量的作用域就仅限于join子句了。接下来的from z in y.DefaultIfEmpty()是把左连接的结果(包括没有匹配到的null值)赋值给了z,这时候再用b就会因为超出作用域而报“未定义”的错误。而且左连接场景下z可能为null,直接访问它的字段还会触发空引用异常,这也是要注意的点。
修复后的查询代码
根据你的需求,这里分两种情况给出修复方案:
情况1:只保留dt中在dt2有匹配,但ref_id不相等的记录
var q = (from a in dt.AsEnumerable() join b in dt2.AsEnumerable() on a.Field<string>("id") equals b.Field<string>("id") into y from z in y.DefaultIfEmpty() // 先判断z不为null,再比较ref_id,避免空引用 where z != null && a.Field<int>("ref_id") != z.Field<int>("ref_id") select new wrongreferralDTO() { c_id = a.Field<int>("captain_id"), event_time = a.Field<DateTime>("event_time") }).ToList();
情况2:保留dt中所有记录,包括在dt2没有匹配的,以及匹配但ref_id不相等的
如果你的需求是要包含dt中没有匹配到dt2的记录,可以调整where条件:
var q = (from a in dt.AsEnumerable() join b in dt2.AsEnumerable() on a.Field<string>("id") equals b.Field<string>("id") into y from z in y.DefaultIfEmpty() // 要么z为null(无匹配),要么匹配但ref_id不等 where z == null || (z != null && a.Field<int>("ref_id") != z.Field<int>("ref_id")) select new wrongreferralDTO() { c_id = a.Field<int>("captain_id"), event_time = a.Field<DateTime>("event_time") }).ToList();
关键注意点
- 左连接的结果必须用
z(你自己定义的遍历变量)来访问,而不是原来的b - 一定要处理
z为null的情况,否则会抛出NullReferenceException
内容的提问来源于stack exchange,提问作者user3346575
相关产品推荐
相关产品推荐

