Linq To Object双字段联表查询返回0条数据问题求助
解决LINQ双字段Join返回0条记录的问题
兄弟,我之前也踩过类似的坑,单字段Join好好的,一用复合字段就返回空,大概率是这几个问题导致的,咱们一个个排查:
1. 匿名类型的属性不匹配(最常见)
C#里匿名类型的Equals方法会严格对比每个属性的名称、类型、大小写,只要有一项不匹配,就会判定为不相等:
- 比如你定义的
key1和key2,两边的属性名必须完全一致(包括大小写,Key1和key1不算匹配); - 更关键的是
egais.Shop和best.Shop的类型必须完全相同!比如一个是int类型的店铺ID,另一个是string类型的店铺名称,哪怕值看起来一样,类型不同也直接匹配失败。调试时可以用typeof(egais.Shop)和typeof(best.Shop)检查类型是否一致。
2. 字段实际值存在隐性差异
单字段Join时AlcCode能匹配,但加了Shop就不行,很可能是Shop字段的值看起来一致,实际有差异:
- 大小写差异:比如
"BeijingShop"和"beijingshop"; - 隐藏字符:比如末尾的空格、制表符,或者全角/半角字符(
"北京店 "和"北京店"); - 内容差异:一个存店铺全称,另一个存缩写,视觉上相似但实际值不同。
建议找一条单字段能匹配的记录,分别输出egais.Shop和best.Shop的原始值,对比后就能发现问题。
3. 空值处理问题
如果某一边的Shop或AlcCode存在null值,匿名类型的对比会判定null和非null不相等。比如:
egais.Shop是null,但best.Shop有值;- 或者反过来,都会导致这组记录匹配失败。
如果允许空值匹配,可以用空合并运算符统一处理:
join best in rests_best on new { Shop = egais.Shop ?? string.Empty, AlcCode = egais.Product.AlcCode ?? string.Empty } equals new { Shop = best.Shop ?? string.Empty, AlcCode = best.Product.AlcCode ?? string.Empty }
4. 代码书写失误(比如重复Join)
看你贴的代码片段里好像写了两次join best in rests_best?如果是不小心重复写了Join,相当于做了两次关联,结果自然为空。正确的双字段Join应该只写一次,用复合匿名类型关联:
List<Result> inner_join = (from egais in rests_egais join best in rests_best on new { egais.Shop, egais.Product.AlcCode } equals new { best.Shop, best.Product.AlcCode } select new Result { // 这里写你的结果映射逻辑 }).ToList();
先从这几个方向排查,应该很快就能找到问题所在!
内容的提问来源于stack exchange,提问作者Иван Иванов
相关产品推荐
相关产品推荐

