基础才是重中之重~理解linq中的groupby

简介:

linq将大部分SQL语句进行了封装,这使得它们更加面向对象了,对于开发者来说,这是一件好事,下面我从基础层面来说一下GroupBy在LINQ中的使用。

对GroupBy的多字段分组,可以看我的这篇文章

概念

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)

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~理解linq中的groupby,如需转载请自行联系原博主。

目录
相关文章
|
SQL BI 索引
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
本篇文章讲解的主要内容是:***如何使用lag函数让结果集重复数据只显示一次、用行转列pivot写法优化部门之间计算工资差异类似需求、如何通过ceil函数对已有数据进行分组打印、放假安排团队分组值班,如何通过ntile()over(order by )快速进行人员分组***
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(二十四):数仓报表场景☞通过执行计划详解”行转列”,”列转行”是如何实现的
本篇文章讲解的主要内容是:***目前Oracle支持的行列互换有两种方式:case when、pivot\unpivot,我将通过几个案例来给大家详解如何通过这两种方式实现“行转列”,“列转行”的需求,并通过执行计划看case when、pivot\unpivot二者的底层逻辑关系以及效率上的影响。***
【SQL开发实战技巧】系列(二十四):数仓报表场景☞通过执行计划详解”行转列”,”列转行”是如何实现的
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
本篇文章讲解的主要内容是:***常用聚集函数及group by与空值的影响、详解通过执行计划看sum()over()分析函数。***
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
|
数据采集 存储 数据管理
[ 数据架构 ]MIKE2.0方法 : 一种信息开发的开源方法
[ 数据架构 ]MIKE2.0方法 : 一种信息开发的开源方法
|
开发者 索引 Python
Groupby 操作延伸|学习笔记
快速学习 Groupby 操作延伸
131 0
|
机器学习/深度学习 .NET
|
.NET 开发框架 数据库
深入调研Linq to Objects Join Linq to Entity
最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity。参考一些网友的代码案例,深入实践了一下使用EntityFramework Code First 下的组合查询。
1250 0