LINQ TO SQL ——Group by

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

分组在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语句来执行。

目录
相关文章
|
2月前
|
SQL 存储 Oracle
SQL,Group By 真扎心,原来是这样
SQL,Group By 真扎心,原来是这样
38 0
|
2月前
|
SQL 关系型数据库 数据处理
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
29 0
|
2月前
|
SQL
SQL中GROUP BY语句与HAVING语句的使用
SQL中GROUP BY语句与HAVING语句的使用
23 1
|
3月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
11 0
|
5月前
|
SQL 数据库
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。
74 0
|
7月前
|
SQL
10SQL - group by关键字
10SQL - group by关键字
19 0
|
8月前
|
SQL 开发框架 .NET
SQL中in和not in在LINQ中的写法
SQL中in和not in在LINQ中的写法
|
9月前
|
SQL 开发框架 .NET
ef linq方式插入+sql操作数据注意事项
ef linq方式插入+sql操作数据注意事项
66 0
|
SQL 程序员 开发工具
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
440 0
【Sql Server】基础之分组查询重复出现多条记录的SQL语句,以及group by和having、min函数运用
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法
SQL 查询表中每门课程成绩最好的前n名学生 优于group by语句的方法