• LINQ to SQL语句(6)之Group By/Having


    Group By/Having操作符

    适用场景:分组数据,为我们查找数据缩小 范围。

    说明:分配并返回对传入参数进行分组操作后的可枚举对象。分 组;延迟

    1.简单形式:

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select g;

    语句描述:使用Group By按CategoryID划分产品。

    说 明:from p in db.Products 表示从表中将产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段归类。其结果命名为g,一旦重 新命名,p的作用域就结束了,所以,最后select时,只能select g。当然,也 不必重新命名可以这样写:

    var q =

      from p in db.Products

      group p by p.CategoryID;

    我们用示意 图表示:

    如果想遍历某类别中所有记录,这样:

    foreach (var gp in q)

    {

      if (gp.Key == 2)

      {

         foreach (var item in gp)

        {

          //do something

        }

      }

    }

    2.Select匿名类 :

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new { CategoryID = g.Key, g };

    说明:在这句LINQ语句中,有2个property:CategoryID和g。这个匿名类,其实质是对返回结果集重新进行了包装。把g的property封装成一 个完整的分组。如下图所示:

    如果想遍历某匿名类中所有记录,要这么做:

    foreach (var gp in q)

    {

      if (gp.CategoryID == 2)

      {

        foreach (var item in gp.g)

        {

           //do something

        }

      }

    }

    3.最大 值

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        MaxPrice = g.Max(p => p.UnitPrice)

       };

    语句描述:使用Group By和Max查找每个CategoryID的最高 单价。

    说明:先按CategoryID归类,判断各个分类产品中单价最大的 Products。取出CategoryID值,并把UnitPrice值赋给MaxPrice。

    4.最小 值

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        MinPrice = g.Min(p => p.UnitPrice)

       };

    语句描述:使用Group By和Min查找每个CategoryID的最低 单价。

    说明:先按CategoryID归类,判断各个分类产品中单价最小的 Products。取出CategoryID值,并把UnitPrice值赋给MinPrice。

    5.平均 值

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        AveragePrice = g.Average(p => p.UnitPrice)

       };

    语句描述:使用Group By和Average得到每个CategoryID的 平均单价。

    说明:先按CategoryID归类,取出CategoryID值和各个分类 产品中单价的平均值。

    6.求和

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        TotalPrice = g.Sum(p => p.UnitPrice)

      };

    语句描述:使用Group By和Sum得到 每个CategoryID 的单价总计。

    说明:先按CategoryID归类,取出 CategoryID值和各个分类产品中单价的总和。

    7.计数

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        NumProducts = g.Count()

      };

    语句描述:使用Group By和Count得到每 个CategoryID中产品的数量。

    说明:先按CategoryID归类,取出 CategoryID值和各个分类产品的数量。

    8.带条件计数

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      select new {

        g.Key,

        NumProducts = g.Count(p => p.Discontinued)

      };

    语句描述:使 用Group By和Count得到每个CategoryID中断货产品的数量。

    说明:先按 CategoryID归类,取出CategoryID值和各个分类产品的断货数量。Count函数里 ,使用了Lambda表达式,Lambda表达式中的p,代表这个组里的一个元素或对象 ,即某一个产品。

    9.Where限制

    var q =

      from p in db.Products

      group p by p.CategoryID into g

      where g.Count() >= 10

      select new {

        g.Key,

         ProductCount = g.Count()

      };

    语句描述:根据产 品的―ID分组,查询产品数量大于10的ID和产品数量。这个示例在Group By子句 后使用Where子句查找所有至少有10种产品的类别。

    说明:在翻译成SQL 语句时,在最外层嵌套了Where条件。

    10.多列(Multiple Columns)

    var categories =

      from p in db.Products

       group p by new

      {

        p.CategoryID,

         p.SupplierID

      }

        into g

        select new

          {

            g.Key,

            g

          };

    语句描述:使用Group By按CategoryID和 SupplierID将产品分组。

    说明:既按产品的分类,又按供应商分类。在 by后面,new出来一个匿名类。这里,Key其实质是一个类的对象,Key包含两个 Property:CategoryID、SupplierID。用g.Key.CategoryID可以遍历CategoryID 的值。

    11.表达式(Expression)

    var categories =

       from p in db.Products

      group p by new { Criterion = p.UnitPrice > 10 } into g

      select g;

    语句描述 :使用Group By返回两个产品序列。第一个序列包含单价大于10的产品。第二个 序列包含单价小于或等于10的产品。

    说明:按产品单价是否大于10分类 。其结果分为两类,大于的是一类,小于及等于为另一类。

  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/liubo/p/2381550.html
Copyright © 2020-2023  润新知