zoukankan      html  css  js  c++  java
  • LINQ TO SQL 中的group

         分组在SQL中应用的十分普遍,在查询,统计时都有可能会用到它。LINQ TO SQL中同样具备group的功能,这篇我来讲下LINQ TO SQL中关于group的用法。

         说明:

               1:group 不一定要用到多表查询中,单表查询也是可以的。

               2:基本语法:

                   1>:group 分组后要取的字段或者是对象;

                   2>:by 分组对象,可以是一列也可以是多列;

                   3>:into 结果集对象。       

               3:group的分类,这里分为单列分组,和多列分组。

           第一:单列分组:及group by 后面跟一个具体的列名。           

           我们以客户表和客户消费表来说明group的用法,年末了,一般都是对帐的时候,对于管理员来说,非常希望知识自己的会员在这一年内的消费总额。为此可以这样写LINQ TO SQL来实现:以下例来说,group 后面的就是分组后要用到的消费金额字段:Price,by后面的是按什么分组,上面是按年份分组,into后面的结果集对象(salesByYear), 即分组后的结果会保存到它里面,之前的c,p的作用域到此为此,后面就只能用salesByYear了。

    from c in Customers
    join p 
    in Purchases
    on c.ID equals p.CustomerID
    group p.Price by p.Date.Year into salesByYear
    select 
    new
    {
    Year
    =salesByYear.Key,
    TotalValue 
    =salesByYear.Sum()
    }

         最后呈现两个内容,一个是年份,一个是所有客户消费的金额总和。

         对应的SQL:

    SELECT SUM([t2].[Price]) AS [TotalValue], [t2].[value] AS [Year]
    FROM (
        SELECT DATEPART(Year, [t1].[Date]) AS [value], [t1].[Price]
        FROM [Customer] AS [t0]
        INNER JOIN [Purchase] AS [t1] ON ([t0].[ID]) 
    = [t1].[CustomerID]
        ) AS [t2]
    GROUP BY [t2].[value]

          单列分组的特点:

                  1:分组后的结果集salesByYear,它有一个特点,就是包含一个Key的属性,它对应group 语法中的by 关键字后面的内容,即按什么分组。

                  2:要想实现SQL中的having功能也特别简单,中需要在group语句完成后,加上相应的where 条件即可。例如:where salesByYear.Sum()>1000

                  3:可以方便的实现对分组后数据的排序:例如在上面的where 条件后加上如下语句:orderby salesByYear.Key descending

                  4:如果是通过计算过的字段要加上一个别名,例如:TotalPrice= salesByYear.Sum(),如果直接写salesByYear.Sum()是不行的。

           第二:多列的分组:就是group by 后面跟一个匿名对象。

                例如:从06年到08年,这三年内,所有用户的消费金额,要显示的内容包含用户名,年份,消费金额。

                最终效果图:和SQL一样,要想在最终的结果集中显示某些字段,那么需要把要显示的字段放进group by 的字段中,所有我们可以通过Year=salesByYear.Key.Year这样来取年份。

             

                代码片断如下:

    from c in Customers
    join p 
    in Purchases
    on c.ID equals p.CustomerID
    group p.Price by 
    new
    {
    p.Date.Year,
    c.Name
    }
    into salesByYear
    orderby salesByYear.Key.Year descending
    select 
    new
    {
    TotalPrice
    = salesByYear.Sum(),
    Year
    =salesByYear.Key.Year,
    Name
    =salesByYear.Key.Name
    }

         

              多列分组中,需要注意以下几个方面:

              1:group语法中的by 后面并不是跟具体的列名, 而是通过一个匿名对象来分组;

              2:多列分组时,结果集salesByYear的Key属性并不是一列值,而是参与分组所有对象的值构成的数组;可以通过salesByYear.Name等等形式呈现;

              3:如果group 后面跟的是具体的列名,如group p.Price,最后的选择列时可以这样写:TotalPrice= salesByYear.Sum();如果后面跟的是对象名,即group p by,最后的选择列时只能这样写:TotalPrice= salesByYear.Sum(p=>p.Price),因为此时的salesByYear的内容是一个对象,并不是单一列。

              4:可以根据salesByYear的Key来取分组字段,Year=salesByYear.Key.Year,而不能这样写Year=salesByYear.Key;

          总结:上面是些比较觉见的LINQ TO SQL中关于group的用法,对拉姆达表达式特别喜欢的朋友,可以用拉姆达表达式来实现。无论是单列分组还是多列,其实本质上和传统SQL的分组原理是一样的,因为LINQ TO SQL最终会翻译成SQL语句来执行。

    注:

       文中示例参考nutshell


  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1358494.html
Copyright © 2011-2022 走看看