C# LINQ GroupBy新增分组键使用强类型模型传视图的方法
多字段分组强类型实现方案
使用强类型dino1模型完全支持多分组键配置、额外查询字段映射,无需向视图传递匿名类型即可实现需求。
实现逻辑说明
- 分组阶段可临时使用匿名类型作为多字段组合分组键,该匿名类型仅在LINQ查询内部生效,不会作为最终结果返回给视图
- 所有需要在视图展示的字段,最终都映射到
dino1类的对应属性,最终输出结果依然是List<dino1>类型,和原有视图强类型绑定逻辑完全兼容 - 注意:非聚合的单值字段(如UserName、Role、fullname等)必须保证在同一组分组键下值完全一致,取同组第一条记录赋值即可;需要拼接的聚合字段(如doctypes、trans、qqqq)沿用原有
string.Join逻辑处理 - 如果需要新增展示字段,先在
dino1类中定义对应属性,再按流程在数据映射、结果赋值环节补充对应逻辑即可
修改后完整代码示例
以下示例以新增UserName、fullname作为额外分组键、补充全字段返回为例,可根据自身业务需求调整分组键字段:
DataTable dt = new DataTable(); using (SqlDataAdapter da = new SqlDataAdapter(comcom)) { da.Fill(dt); } var zxc = from uu in dt.AsEnumerable() select new dino1 { UserName = uu.Field<string>("UserName"), Role = uu.Field<string>("Role"), appcode = uu.Field<string>("appcde"), fullname = uu.Field<string>("fullname"), scheduledate = uu.Field<DateTime>("Scheddte"), datecreated = uu.Field<DateTime>("DateCreated"), doctypes = uu.Field<string>("doctype"), trans = uu.Field<string>("transactions"), qqqq = uu.Field<string>("quantity"), // 新增字段在此处补充DataTable列到dino1属性的映射即可 }; // 多字段分组:在new{}内按需求追加所有分组键 var res1 = zxc.GroupBy(cc => new { cc.appcode, cc.UserName, cc.fullname }) .Select(dd => new dino1 { // 分组键字段从分组Key中取值 appcode = dd.Key.appcode, UserName = dd.Key.UserName, fullname = dd.Key.fullname, // 同组内值固定的单值字段,取第一条记录的对应值即可 Role = dd.First().Role, scheduledate = dd.First().scheduledate, datecreated = dd.First().datecreated, // 多值聚合字段沿用原有拼接逻辑 doctypes = string.Join(", ", dd.Select(ee => ee.doctypes).ToList()), trans = string.Join(", ", dd.Select(ee => ee.trans).ToList()), qqqq = string.Join(", ", dd.Select(ee => ee.qqqq).ToList()) // 新增字段在此处补充对应赋值逻辑即可 }); var namaewa = res1.ToList();
最终得到的
namaewa是标准的List<dino1>类型,直接传入视图后,原有强类型绑定逻辑不需要做特殊调整即可正常接收、展示所有字段。
内容的提问来源于stack exchange,提问作者Zen
相关产品推荐
相关产品推荐

