.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), // 其他字段如果需要,根据业务逻辑赋值(比如取第一个元素的对应值) }); }
额外注意点
- 空引用防护:一定要检查
prototypesBindingSource.DataSource是否为List<Prototypes>,避免数据源为空时抛出异常。 - 描述字段处理:如果同一个
PROTOTYPE_CODE对应不同的PROTOTYPE_DESCR,你需要调整描述的取值逻辑(比如用string.Join(", ", group.Select(g => g.PROTOTYPE_DESCR).Distinct())去重拼接)。 - 查询语法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
相关产品推荐
相关产品推荐

