1.简单形式:
- var q =
- from p in db.Products
- group p by p.CategoryID into g
- select g;
语句描述:Linq使用Group By按CategoryID划分产品。
说明:from p in db.Products 表示从表中将产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段归类。其结果命名为g,一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。
2.最大值
- var q =
- from p in db.Products
- group p by p.CategoryID into g
- select new {
- g.Key,
- MaxPrice = g.Max(p => p.UnitPrice)
- };
语句描述:Linq使用Group By和Max查找每个CategoryID的最高单价。
说明:先按CategoryID归类,判断各个分类产品中单价最大的Products。取出CategoryID值,并把UnitPrice值赋给MaxPrice。
3.最小值
- var q =
- from p in db.Products
- group p by p.CategoryID into g
- select new {
- g.Key,
- MinPrice = g.Min(p => p.UnitPrice)
- };
语句描述:Linq使用Group By和Min查找每个CategoryID的最低单价。
说明:先按CategoryID归类,判断各个分类产品中单价最小的Products。取出CategoryID值,并把UnitPrice值赋给MinPrice。
4.平均值
- var q =
- from p in db.Products
- group p by p.CategoryID into g
- select new {
- g.Key,
- AveragePrice = g.Average(p => p.UnitPrice)
- };
语句描述:Linq使用Group By和Average得到每个CategoryID的平均单价。
说明:先按CategoryID归类,取出CategoryID值和各个分类产品中单价的平均值。
5.求和
- var q =
- from p in db.Products
- group p by p.CategoryID into g
- select new {
- g.Key,
- TotalPrice = g.Sum(p => p.UnitPrice)
- };
在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下:
- 上表是所有政区,商圈中的餐饮个数,名为FoodDistrict
- 下表是所有政区,商圈中的SPA个数,名为SPADistrict
现在要把这两张表,根据政区和商圈合并,然后相加Counts,根据Counts的总大小排序,统计热门商圈和热门政区。
在这里仅讨论合并的问题,以演示在SQLServer和C#中LINQ的实现方法:
通常,我们可以直接通过在SQLServer里面首先通过Union All,然后再通过GroupBy语句来执行查询操作即可满足要求,过程如下:
SELECT d.CityLocationId , d.CityLocationName , d.BusinessDistrctID , d.BusinessDistrctName , SUM(Counts) AS Counts FROM ( SELECT * FROM FoodDistrict UNION ALL SELECT * FROM SPADistrict ) d GROUP BY d.CityLocationId , d.CityLocationName , d.BusinessDistrctID , d.BusinessDistrctName ORDER BY Counts DESC
执行结果为:
这里面需要注意的是,Union和Union All的区别,Union会对相同的记录去重,所以这里采用的是Union All,另外Union或者Union All的两个字表或者查询中,不能够有Order By子句。一般是Union之后再进行Order By。
但是有些时候,以上两张表可能存在与不同的数据库中,或者即使存在同一个数据库中,业务逻辑方面也不应该都放到数据库中,否则容易会使得数据库性能成为瓶颈。所以在某些时候,以上操作可能需要移到业务逻辑中处理。
在C#中,我们可能会先取回两个List实体,这两个实体分别从数据库中获得,在C#中,我们使用LINQ语句的聚合,分组也能实现SQLServer类似的功能。
private List<BusinessDistrictWithCountModel> CombineDistrict(List<BusinessDistrictWithCountModel> foodBusinessDistrict, List<BusinessDistrictWithCountModel> spaBusinessDistrict) { List<BusinessDistrictWithCountModel> result; result = new List<BusinessDistrictWithCountModel>(); result = foodBusinessDistrict.Concat(spaBusinessDistrict). GroupBy(x => new { x.CityLocationID, x.CityLocationName, x.BusinessDistrctID, x.BusinessDistrctName }) .Select(g=> new BusinessDistrictWithCountModel { CityLocationID = g.Key.CityLocationID, CityLocationName = g.Key.CityLocationName, BusinessDistrctID = g.Key.BusinessDistrctID, BusinessDistrctName = g.Key.BusinessDistrctName, ProductCount = g.Sum(a => a.ProductCount) }) .OrderByDescending(x => x.ProductCount) .ToList(); return result; }
在LINQ中将两个集合合并有两个方法,Union和Concat,其中Union会对集合中相同的元素进行去重,而Concat则不会。这两个关键字分别对应SQLServer中的Union和Union All。
Linq中的GroupBy和SQLServer中的GoupBy也类似,将需要Group的字段放到一个匿名对象里,然后在紧接着的Select中,我们可以从key中拿到Group里的字段,然后还可以进行一些诸如Sum,Count等统计操作。
另外,在C#中将一个集合对象转换为另外一个集合对象的时候,可以使用Select或者ConvertAll这两个关键字,Select是LINQ里面的扩展方法,对于任何实现IEnumerable<>泛型接口的对象都可以使用,在.NET 3.5及以上平台上支持,并且和其他LINQ操作符一样,他是延迟执行(lazy evaluation)的;而ConvertAll则是List<>对象的方法,在.NET 2.0及以上版本中均可以使用,它是立即执行,但是他们的作用相同,我们只需要传入转换的方法即可。
相关推荐
Linq Grouping GroupBy 用法详解 Linq Grouping GroupBy 用法详解
废话不多说了,直接给大家贴代码了,具体代码如下所示: public class Person { public string FirstName{set;get;} public string LastName{set;get;} public Person(){} public Person(string firstName, ...
最近发现了一个问题,在服务器端的Linq GroupBy 和OrderBy居然不管用,后来终于解决了所以现在分享给大家,有需要的朋友们可以参考借鉴。
Linq中GroupBy方法的使用总结.
LINQ to SQL语句(6)之Group By/Having LINQ to SQL语句(7)之Exists/In/Any/All/Contains LINQ to SQL语句(8)之Concat/Union/Intersect/Except LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods LINQ to SQL语句...
主要介绍了C#在LINQ中如何使用GroupBy,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
101 个 LINQ 源码实例 Select Where OrderBy GroupBy Join In, Like Lambda xml
8. C#3.0入门系列(八)-之GroupBy操作 GroupBy 操作入门。 9. C#3.0入门系列(九)-之GroupBy操作 更多GroupBy操作。 10. C#3.0入门系列(十)-之Join操作 Join操作 11. C#3.0入门系列(十一)-之In, Like...
用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT
LINQ的语义: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件] LINQ的查询返回值的类型是临时变量的类型,可能是一个对象也可能是一个集合。...
一个简单的LINQ演示程序,供新手使用。演示了LINQ的查询功能,如基本查询,条件查询,group by等。LINQ不是一种语言,不能单独用来开发。 LINQ体现的是面向对象思想:源数据时对象,查询结果是对象
Group By Key = New With {prod.CategoryID, prod.SupplierID} _ Into prodGroup = Group _ Select Key, prodGroup Linq to xml: Dim doc = XDocument.Load(dataPath & "bib.xml") Dim content = From book In...
6. 带GroupBy形式 22 LINQ to SQL语句(6)之Group By/Having 23 Group By/Having操作符 23 1.简单形式: 23 2.Select匿名类 : 24 3.最大 值 25 4.最小 值 26 5.平均 值 26 6.求和 26 7.计数 27 8.带条件计数 27 9....
C#是一种通用的编程语言,由微软公司开发和推出,并广泛应用于Windows操作系统和.NET Framework开发中。它是一种面向对象的语言...LINQ提供了丰富的查询操作符和方法,如Where、OrderBy、GroupBy、Select等,可以.....
3.7.1 OrderBy和OrderByDescending 3.7.2 ThenBy和ThenByDescending 3.8 let子句 3.9 join子句 3.10 小结 第4章 用于集合、文件、字符串对象的LINQ(LINQ to Objects) 4.1 LINQ标准查询运算符概述 4.2 ...
摘要:本文介绍Linq查询基本操作(查询关键字) – from 子句 – where 子句 – select子句 – group 子句 – into 子句 – orderby 子句 – join 子句 – let 子句 – 复合from子句 – 在某些情况下,源...
3.7.1 OrderBy和OrderByDescending 3.7.2 ThenBy和ThenByDescending 3.8 let子句 3.9 join子句 3.10 小结 第4章 用于集合、文件、字符串对象的LINQ(LINQ to Objects) 4.1 LINQ标准查询运算符概述 4.2 ...
LINQ定义了大约40个查询操作符,如select、from、in、where、group 以及order by,借助于LINQ技术,C#语音可以实现,javascript也可以实现