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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:49:50