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

.NET C#项目中Group By分组求和功能失效问题求助

解决LINQ分组求和的上下文错误问题

首先,咱们先搞清楚你报错的根本原因:当你在LINQ里执行group分组操作后,原来的search变量就不在当前查询的上下文里了。分组会把符合条件的元素打包成一个分组集合(比如你定义的codeGroup),此时你只能访问分组的键(codeGroup.Key)或者分组里的元素集合,再也不能直接引用分组前的单个search对象——这就是为什么会提示“search不存在于当前上下文”。

接下来给你两种可行的实现方案,根据你的返回需求选择:

方案1:返回匿名类型(适合直接绑定显示总和)

如果只是要展示分组后的编码、描述和总pieces数,用匿名类型最直接,不需要修改原Prototypes类:

private IEnumerable<object> GetQuery()
{
    // 先把数据源转成List,同时做null检查避免崩溃
    var sourceData = prototypesBindingSource.DataSource as List<Prototypes>;
    if (sourceData == null)
        return Enumerable.Empty<object>();

    // 第一步:过滤符合搜索条件的记录
    var filteredItems = sourceData.Where(item => 
        item.PROTOTYPE_CODE == textSearch.Text 
        || item.PROTOTYPE_DESCR == textSearch.Text);

    // 第二步:按编码分组,然后求和pieces
    var groupedResult = filteredItems
        .GroupBy(item => item.PROTOTYPE_CODE)
        .Select(group => new 
        {
            PROTOTYPE_CODE = group.Key,
            // 假设同编码的描述一致,取分组里第一个的描述;如果不一致可以改成拼接或其他逻辑
            PROTOTYPE_DESCR = group.First().PROTOTYPE_DESCR,
            TotalPieces = group.Sum(item => item.pieces)
        });

    return groupedResult;
}

方案2:返回原Prototypes类型(兼容现有代码结构)

如果你的方法必须返回IEnumerable<Prototypes>,可以创建新的Prototypes实例,把求和后的pieces赋值进去:

private IEnumerable<Prototypes> GetQuery()
{
    var sourceData = prototypesBindingSource.DataSource as List<Prototypes>;
    if (sourceData == null)
        return Enumerable.Empty<Prototypes>();

    return sourceData
        .Where(item => 
            item.PROTOTYPE_CODE == textSearch.Text 
            || item.PROTOTYPE_DESCR == textSearch.Text)
        .GroupBy(item => item.PROTOTYPE_CODE)
        .Select(group => new Prototypes
        {
            PROTOTYPE_CODE = group.Key,
            PROTOTYPE_DESCR = group.First().PROTOTYPE_DESCR,
            pieces = group.Sum(item => item.pieces),
            // 其他字段如果需要,根据业务逻辑赋值(比如取第一个元素的对应值)
        });
}

额外注意点

  1. 空引用防护:一定要检查prototypesBindingSource.DataSource是否为List<Prototypes>,避免数据源为空时抛出异常。
  2. 描述字段处理:如果同一个PROTOTYPE_CODE对应不同的PROTOTYPE_DESCR,你需要调整描述的取值逻辑(比如用string.Join(", ", group.Select(g => g.PROTOTYPE_DESCR).Distinct())去重拼接)。
  3. 查询语法vs方法语法:你之前尝试的Group By ... Into ...是LINQ查询语法,其实也能写,但要注意分组后只能访问分组变量,比如:
    var result = from item in sourceData
                 where item.PROTOTYPE_CODE == textSearch.Text || item.PROTOTYPE_DESCR == textSearch.Text
                 group item by item.PROTOTYPE_CODE into codeGroup
                 select new 
                 {
                     PROTOTYPE_CODE = codeGroup.Key,
                     TotalPieces = codeGroup.Sum(i => i.pieces)
                 };
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:07:35