如何获取IGrouping<'a, Foo>的计数?基于分组构建ViewModel列表
解决Linq分组转ViewModel列表的问题
嘿,我来帮你搞定这个分组转换的需求!其实思路很清晰:先遍历每个分组,根据分组内元素的数量决定是批量生成ViewModel还是单个生成,最后把所有结果收集到目标列表里。
直观的循环实现方案
假设你的SomeList是IEnumerable<IGrouping<(int OrderId, DateTime DateTime), Foo>>类型(用元组打包了OrderID和DateTime作为分组键),Foo是包含OrderLines信息的原始实体,ViewModel是你定义的视图模型类,代码可以这么写:
// 初始化目标视图模型列表 List<ViewModel> viewModelList = new List<ViewModel>(); // 遍历每个分组 foreach (var orderGroup in SomeList) { // 从分组键中获取当前订单的ID和时间 var orderId = orderGroup.Key.OrderId; var orderDateTime = orderGroup.Key.DateTime; if (orderGroup.Count() > 1) { // 分组包含多条OrderLines,遍历每个子项生成ViewModel foreach (var orderLine in orderGroup) { viewModelList.Add(new ViewModel { OrderId = orderId, OrderDateTime = orderDateTime, // 映射OrderLine的具体属性,比如行ID、产品名、数量等 OrderLineId = orderLine.OrderLineId, ProductName = orderLine.ProductName, Quantity = orderLine.Quantity // 其他需要的属性... }); } } else { // 分组只有一条OrderLine,直接取第一个元素生成ViewModel var singleOrderLine = orderGroup.First(); viewModelList.Add(new ViewModel { OrderId = orderId, OrderDateTime = orderDateTime, OrderLineId = singleOrderLine.OrderLineId, ProductName = singleOrderLine.ProductName, Quantity = singleOrderLine.Quantity // 其他需要的属性... }); } }
更简洁的Linq链式调用写法
如果喜欢更紧凑的代码风格,用SelectMany可以把嵌套逻辑合并成一行链式代码,效果和上面的循环完全一致:
List<ViewModel> viewModelList = SomeList .SelectMany(group => // 根据分组数量选择生成逻辑 group.Count() > 1 ? group.Select(line => new ViewModel { OrderId = group.Key.OrderId, OrderDateTime = group.Key.DateTime, OrderLineId = line.OrderLineId, ProductName = line.ProductName, Quantity = line.Quantity }) : new[] { new ViewModel { OrderId = group.Key.OrderId, OrderDateTime = group.Key.DateTime, OrderLineId = group.First().OrderLineId, ProductName = group.First().ProductName, Quantity = group.First().Quantity } }) .ToList();
几个关键注意点
- 分组的
Key属性就是你分组时指定的OrderID和DateTime组合,不管你用的是元组还是匿名类型,都可以直接通过group.Key.XXX访问这两个值 - 要确保
Foo类里包含了你需要的OrderLines相关字段(比如OrderLineId、产品信息等),这样才能正确映射到ViewModel - 如果你的分组键用的是匿名类型(比如
groupBy(f => new { f.OrderID, f.DateTime })),代码逻辑完全不变,只是访问键属性时用group.Key.OrderID即可
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

