如何用GroupBy和Where查询列表,找到首个可用时间槽的客户
修正Lambda查询逻辑,找到首个拥有指定可用时间的客户
我来帮你调整这个查询的问题,你的现有代码存在几个逻辑和语法上的错误,咱们一步步修正:
原代码的核心问题
- 筛选条件完全反向:你要找拥有时间3的客户,但原代码用了
t.time != 3,这会排除所有时间为3的记录,完全不符合需求 - 分组后类型不匹配:
GroupBy返回的是IGrouping<int, CustomerSlot>集合,直接调用FirstOrDefault()得到的是分组对象,不是CustomerSlot类型,这也是语法报错的原因
正确的查询实现
根据你的需求——找到首个(按customerid升序)拥有时间3的客户,这里提供两种常用的实现方式:
方式1:获取该客户的任意一条CustomerSlot记录
CustomerSlot timeSpaceFound = lstCustomerSlots .Where(t => t.time == 3) // 筛选出所有时间为3的记录 .GroupBy(c => c.customerid) // 按客户ID分组,确保每个客户只出现一次 .OrderBy(group => group.Key) // 按客户ID升序排序 .Select(group => group.First()) // 取每个分组的第一条记录(也可以取任意一条) .FirstOrDefault(); // 获取第一个符合条件的客户记录
方式2:仅获取符合条件的首个客户ID
如果只需要客户ID,不需要完整的CustomerSlot对象,可以简化查询:
int? firstCustomerIdWithTime3 = lstCustomerSlots .Where(t => t.time == 3) .Select(c => c.customerid) .Distinct() // 去重,确保每个客户ID只出现一次 .OrderBy(id => id) .FirstOrDefault();
额外说明
如果你的实际需求是找到首个不包含时间3的客户(原代码的筛选条件似乎暗示了这个可能),那逻辑需要调整为:
CustomerSlot firstCustomerWithoutTime3 = lstCustomerSlots .GroupBy(c => c.customerid) .Where(group => !group.Any(slot => slot.time == 3)) // 筛选出没有时间3的客户分组 .OrderBy(group => group.Key) .Select(group => group.First()) .FirstOrDefault();
内容的提问来源于stack exchange,提问作者Robert Smith
相关产品推荐
相关产品推荐

