You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 通过公共ID合并两个对象列表并解决LINQ查询结果为空问题

问题排查与解决

1. 首要错误:Customer对象赋值时变量重复使用

你在创建obj1、obj2两个Customer实例时,ID和Name属性都错误赋值给了第一个创建的obj变量,新实例的ID始终是默认值0:

Customer obj1 = new Customer();
obj.ID = 6; obj.Name = "Ram"; cust.Add(obj1); // 错误:给obj赋值而非obj1,obj1的ID为默认值0

Customer obj2 = new Customer();
obj.ID = 7; obj.Name = "Alex"; cust.Add(obj2); // 错误:给obj赋值而非obj2,obj2的ID为默认值0

这就导致cust列表中三个元素的ID实际为5、0、0,和order列表的ID 5、6、8本来就只有ID=5可以匹配,其他全部无法关联。

2. 次要错误:Order对象赋值时变量写错

给order3赋值Product属性时,错误写为给order2赋值,会导致order3的Product为默认空值,同时覆盖了order2原本的Product值:

Order order3 = new Order();
order3.ID = 8; order2.Product = "Computer"; order.Add(order3); // 错误:修改order2而非order3的属性

3. 可选场景:需要保留单侧数据时使用左外连接

你当前用的是内连接,仅会返回两边ID同时存在的记录。如果需要保留没有对应Order的Customer、或者没有对应Customer的Order,需要调整为左外连接/全连接,左外连接示例:

var od = from c in cust
         join o in order on c.ID equals o.ID into temp
         from o in temp.DefaultIfEmpty()
         select new OrderDetails
         {
             ID = c.ID,
             Name = c.Name,
             Product = o?.Product ?? ""
         };

修正后可正常运行的代码

List<Customer> cust = new List<Customer>();
List<Order> order = new List<Order>();
List<OrderDetails> orderDetails = new List<OrderDetails>();

Customer obj = new Customer();
obj.ID = 5; obj.Name = "Sam"; cust.Add(obj);

Customer obj1 = new Customer();
obj1.ID = 6; obj1.Name = "Ram"; cust.Add(obj1); // 修正赋值变量为obj1

Customer obj2 = new Customer();
obj2.ID = 7; obj2.Name = "Alex"; cust.Add(obj2); // 修正赋值变量为obj2

Order order1 = new Order();
order1.ID = 5; order1.Product = "Book"; order.Add(order1);

Order order2 = new Order();
order2.ID = 6; order2.Product = "Game"; order.Add(order2);

Order order3 = new Order();
order3.ID = 8; order3.Product = "Computer"; order.Add(order3); // 修正赋值变量为order3

var od = from c in cust
         join o in order
         on c.ID equals o.ID
         select new OrderDetails
         {
             ID = c.ID,
             Name = c.Name,
             Product = o.Product
         };

orderDetails = od.ToList();

修正后内连接会返回ID=5、6两条匹配记录,orderDetails元素数量为2,符合预期。

内容的提问来源于stack exchange,提问作者Buddy26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:09:00