zoukankan      html  css  js  c++  java
  • 基础才是重中之重~理解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)

  • 相关阅读:
    Linux服务器centos7系统下搭建Jenkins
    在Linux下执行Jmeter脚本
    Jmeter进阶篇之监控服务器cpu,内存
    Jmeter进阶篇之保存测试结果
    Jmeter进阶篇之逻辑控制器
    Jmeter在非GUI(命令行)模式下生成测试报告
    电商平台满减活动需求分析
    如何在服务器上搭建svn
    电商平台抽奖活动需求分析
    28岁转行软件测试晚不晚
  • 原文地址:https://www.cnblogs.com/lori/p/3174120.html
Copyright © 2011-2022 走看看