基础才是重中之重~理解linq中的groupby
linq将大部分SQL语句进行了封装,这使得它们更加面向对象了,对于开发者来说,这是一件好事,下面我从基础层面来说一下GroupBy在LINQ中的使用。
概念
GroupBy,顾名思义,它是对集合中某个或者某几个字段进行分组,按着这个分组字段(这里叫key)进行排列,例如,我们按着用户表中部分进行分组,结果它会把人事部门的用户信息放在一起,技术部门的用户信息放在一起,一般地,在SQL里,我们只是对它们进行简单的聚集计算,如按着部门进行人员数量上的统计,按着学科统计一个学生的成绩等等,而LINQ中,这个功能当然也可以实现,但不是今天的重点,也不是LINQ本身的重要,LINQ是面向对象的,它的groupby也是一样,它把将各个部门中的用户信息实体放在一个集合里,给开发人员返回一个完整的用户对象。
实例
用户表结构:
要实现的功能:对用户表中“部门”字段“进行分组,将一个部门的用户列表做到一起,呵呵
代码实现1:
var linq = UserRepository.GetModel().GroupBy(i => i.DepartmentID); linq.ToList().ForEach(i => { Response.Write(i.Key + "<hr>"); foreach (var item in i as IGrouping<int, WebManageUsers>) { Response.Write(item.RealName); } Response.Write("<hr>"); });
代码实现2:事实上,实现上面的实现groupby已经做了一些重载,可以直接实现,如下代码:
var user = UserRepository.GetModel().GroupBy(i => i.DepartmentID, (i, v) => new { DepartmentID = i, userlist = v,//这里的userlist是一个集合,它应该是延时的,不能使用ToList()将它在代码块中变为立即执行的,同理不能使用First(),FirstOrDefault等实时查询的方法 }); user.ToList().ForEach(i => { Response.Write(i.DepartmentID + "<hr>"); i.userlist.ToList().ForEach(j => { Response.Write(j.RealName); }); Response.Write("<hr>"); });
结果如图:
比较这两种方法,觉得第二种的结构更好一些,第一种逻辑上比较简单,但引入了新的类型IGrouping<Key,IEnumerable<Value>>,对于这种情况,个人还是推荐用第二种方法。
代码测试环境为Linq To Entity(entityframework 5)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2012-07-05 有意思的业务~根据角色与信息状态,显示指定信息列表
2011-07-05 不忘本~接口