Linq内连接分组后出现空组,如何筛选出有订单的客户?
解决Linq查询保留无订单客户的问题
你当前使用的是Group Join(into orderGroup的写法),这种Join会保留左表(customers)中的所有记录,哪怕右表(orders)没有匹配的订单,因此结果里会出现Orders为空的客户。要过滤掉这类客户,有两种简单的修改方式:
方法1:在Group Join后添加过滤条件
直接在select语句前加入where orderGroup.Any(),通过判断分组后的订单集合是否存在数据,排除没有订单的客户:
var customerOrders = (from customer in customers join order in orders on customer.CustomerId equals order.CustomerId into orderGroup where orderGroup.Any() // 过滤无订单的客户分组 select new { customer.CustomerId, Orders = orderGroup.ToList() }).ToList();
方法2:使用Inner Join + 分组
如果不需要沿用原Group Join的结构,也可以用Inner Join(不带into的普通关联)——这种Join本身只会保留两边都有匹配记录的客户,之后再按客户ID分组即可:
var customerOrders = (from customer in customers join order in orders on customer.CustomerId equals order.CustomerId group order by customer.CustomerId into orderGroup select new { CustomerId = orderGroup.Key, Orders = orderGroup.ToList() }).ToList();
两种方案都能满足需求:第一种贴近你原有代码逻辑,修改成本低;第二种利用Inner Join的特性直接排除无订单客户,逻辑更简洁。
内容的提问来源于stack exchange,提问作者AtomicallyBeyond
相关产品推荐
相关产品推荐

