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
相关产品推荐
相关产品推荐

