原文: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语句来执行。

LINQ TO SQL ——Group by的更多相关文章

  1. C# Linq to SQL — Group by

    需求是需要统计数据库中表某一列的总数量,同时以List的形式返回到UI层. Linq to SQL中的Group by用法如下: IList<Unit.HandleCountClass> ...

  2. Linq to SQL -- Group By、Having和Exists、In、Any、All、Contains

    Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...

  3. LINQ系列:LINQ to SQL Group by/Having分组

    1. 简单形式 var expr = from p in context.Products group p by p.CategoryID into g select g; foreach (var ...

  4. linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)

    Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...

  5. C# Linq to sql 实现 group by 统计多字段 返回多字段

    Linq to sql 使用group by 统计多个字段,然后返回多个字段的值,话不多说,直接上例子: where u.fy_no == fy_no orderby u.we_no group u  ...

  6. linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符) (转帖)

    http://wenku.baidu.com/link?url=2RsCun4Mum1SLbh-LHYZpTmGFMiEukrWAoJGKGpkiHKHeafJcx2y-HVttNMb1BqJpNdw ...

  7. LinQ to SQL 及 non-LinQ方式实现Group的Performance对比

    拥有476550数据的一张数据表.使用其中的某个字段分组,然后按该字段进行排序.该需求分别使用LinQ to SQL和non-LinQ的方式实现,然后来看一下performance对比. LinQ w ...

  8. LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和Exists/In/Any/All/Contains操作符. Group By/Having操作符 适用场景 ...

  9. [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)

    本文转自:http://www.cnblogs.com/jack-liang/archive/2011/03/22/1991554.html Group By/Having操作符 适用场景:分组数据, ...

随机推荐

  1. 如何出色的研究 RGSS3 (三) 形式的调整的细节

    在一个我们研究了添加到窗体方法的选择,这个问题来研究窗体类的细节. 所有形式的父类的 Window_Base 四个参数需要初始化. #--------------------------------- ...

  2. PHP IOS PUSH Demo

    <?php // Put your device token here (without spaces): $deviceToken = '679b466b030038bed6c3a2563c7 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ...

  4. Codeforces 10C Digital Root 法冠军

    主题链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<se ...

  5. C#记录日志、获取枚举值 等通用函数列表

    )             {                 ] >=  && ipvals[] <=                  && ipval ...

  6. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  7. linux_ubuntu12.04 卸载和安装mysql、远程访问、not allowed

    一: 安装mysql 卸载mysql 第一步 sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-se ...

  8. CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)

    模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...

  9. 【Hibernate步步为营】--映射合集汇总

    前几篇文章具体讨论了对象模型到关系模型的转化方法,对映射关系做了具体的了解,Hibernate将对象模型转化为对应的关系模型是通过使用对应的映射来完毕的(相同也能够使用注解),对于对象之间的关系的转化 ...

  10. [LeetCode]N-Queens 八皇后问题扩展(经典深层搜索)

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...