前言

  分组就是将元数据通过某些条件划分为组,而聚合就是对这些组进行整合操作;在sqlserver数据库中使用的关键字group by使符合条件的集合通过某些字段分好组,再使用聚合函数(如max()、mix())整合结果集;

FreeSql的聚合分组与数据库命名一样,分组使用GroupBy(),配合Sum()、Max()、Min()等聚合方法进行聚合分组;

GroupBy分组聚合

  根据姓名分组(添加数据的时候使用了xx1,xx2这样的命名)后,使用Having()方法排除了记录数小于等于1的记录,并根据记录数进行了倒叙,查询了姓名和数量。

  1. _freeSql.Select<Student>()
  2. .GroupBy(x => new { Name = x.Name.Substring(0, 2) })
  3. .Having(x => x.Count() > 1)
  4. .OrderByDescending(x => x.Count())
  5. .ToList(x => new { x.Key.Name, Count = x.Count() });
  6. //[{"Name":"小明","Count":10},{"Name":"小红","Count":2}]
  7. //SELECT substring(a.[Name], 1, 2), count(1) as1
  8. //FROM[Student] a
  9. //GROUP BY substring(a.[Name], 1, 2)
  10. //HAVING(count(1) > 1)
  11. //ORDER BY count(1) DESC

  

ToAggregate聚合

  官方推荐另一种不分组求聚合值的方法,就是使用 ToAggregate 替代 ToList

  1. _freeSql.Select<Student>()
  2. .Where(x => x.Age > 5)
  3. .Aggregate(x => x.Avg(x.Key.Age), out var age);
  4. //SELECT avg(a.[Age]) as1
  5. //FROM [Student] a
  6. //WHERE (a.[Age] > 5)
  7. //结果为age的值

踩个坑

  如果使用这个写法会发生什么呢?

  1. _freeSql.Select<Student>()
  2. .Aggregate(x => new { count = x.Count(), sum = x.Sum(x.Key.Age) }, out var res)
  3. .Where(x => x.Age > 5)
  4. .ToList();

  前面说过ToAggregate 是代替ToList的,也就是说首先会去算一下记录数、和,赋值给变量res,然后再使用Age>5的条件去查一次数据,sql如下

  1. SELECT count(1) as1, sum(a.[Age]) as2
  2. FROM [Student] a
  3. SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
  4. FROM [Student] a
  5. WHERE (a.[Age] > 5)

  

  所以上面的写法会造成两次查询,一次是执行Aggregate(),一次是执行ToList(),由于执行Aggregate()的时候没有条件,所以结果为全表的Count()、Sum(),将Aggregate()使用,就好理解了

  如果需要查询数据集,又要聚合查询,可以将Where提到前面,这样聚合也就有了条件;

  1. _freeSql.Select<Student>()
  2. .Where(x => x.Age > 5)
  3. .Aggregate(x => new { count = x.Count(), sum = x.Sum(x.Key.Age) }, out var res)
  4. .ToList();
  5. //SELECT count(1) as1, sum(a.[Age]) as2
  6. //FROM [Student] a
  7. //WHERE (a.[Age] > 5)
  8. //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
  9. //FROM [Student] a
  10. //WHERE (a.[Age] > 5)

FreeSql学习笔记——7.分组聚合的更多相关文章

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...

  2. SQL反模式学习笔记15 分组

    目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. ...

  3. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  4. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  5. MongoDB学习笔记五:聚合

    『count』count是最简单的聚合工具,返回集合中的文档数量:> db.foo.count()0> db.foo.insert({"x" : 1})> db. ...

  6. 1.4(SQL学习笔记)分组、子查询、联结、组合查询

    一.分组 建表及数据填充语句下载:链接: https://pan.baidu.com/s/1WHYafwqKJEKq1kDwCH_Zlg 提取码: 3wy4 1.1初识分组 分组是按照某一列,将该列中 ...

  7. MongoDB 学习笔记之 group聚合

    group聚合: key: 分组字段 cond:过滤条件 reduce: curr是当前行 result是每组的结果集 initial : 组变量初始值 finalize: 统计一组后的回调函数 用g ...

  8. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  9. MySql cmd下的学习笔记 —— 有关分组的操作(group by)

    (一) 把建立的goods表找到 (二) 当cat_id = 3时,计算所有商品的库存量之和 计算每个cat_id下的库存量(group by) 需要用到分组,把每个红框内的计算在一起 筛选出本店价比 ...

  10. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

随机推荐

  1. Phpstorm之快捷键

    常用快捷键 1.ctrl+alt+s 快速打开setting系统设置 2.CTRL+/ 单行注释/取消注释 CTRL+SHIFT+/ 块状注释/取消块状注释 3.方法体上面打入'/**' 再按回车键 ...

  2. Less使用备忘录

    定义 Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言,动态样式语言. 使用方式 直接引入less.js文件 好处:能获取客户端的数据,从而进行进一步的 ...

  3. 史上最牛X的微信公众号!

    今天给大家推荐一个最牛逼的微信公众号,专注分享技术干货,包括但不限于Java,HTML,JavaScript,MySQL,Redis,Windows,Linux,Spring,SpringBoot,V ...

  4. 2024年1月Java项目开发指南19:Vue动态页面渲染

    以文章为例子,我们获取了文章列表. 现在想实现,点击文章列表里面的某一篇文章,跳转页面,这个页面显示文章的具体内容. 那么应该怎么实现. 首先,你要创建一个文章详情页的组件(article.vue) ...

  5. kafka各个版本的特性

    1. kafka-0.8.2 新特性 1.1 异步发送 producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率.producer请求会返回一个 ...

  6. jenkins build

    clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent org.owasp:dependency-check-maven:5.3.0 ...

  7. IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点

    本文由vivo技术团队Li Guanyun分享,为了提升阅读体验,进行了较多修订和重新排版. 1.引言 Protobuf 作为一种跨平台.语言无关.可扩展的序列化结构数据通讯协议,已广泛应用于网络数据 ...

  8. 思维导图学《Java性能权威指南》

    目录 性能测试 Java 性能调优工具箱 JIT 编译器 垃圾收集 原生内存 线程与同步的性能 Java API 技巧 GitHub LeetCode 项目 目录 YANO SPACE 2021 计划 ...

  9. Solution Set -「DS 专题」兔年的兔子写 DS 会有小常数吗?

    目录 Day 1 「Ynoi 2009」「洛谷 P6109」rprmq1 ^ 「Ynoi Easy Round 2021」「洛谷 P8512」TEST_152 「Ynoi 2005」「洛谷 P7907 ...

  10. Task异常处理的坑

    全局异常 TaskScheduler.UnobservedTaskException += (e, args) =>{ MessageBox.Show("ddddddddddddddd ...