`
sangei
  • 浏览: 336315 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

linq group by 操作

阅读更多

1.简单形式:

  1. var q =
  2. from p in db.Products
  3. group p by p.CategoryID into g
  4. 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.最大值

  1. var q =
  2. from p in db.Products
  3. group p by p.CategoryID into g
  4. select new {
  5. g.Key,
  6. MaxPrice = g.Max(p => p.UnitPrice)
  7. };

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

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

3.最小值

  1. var q =
  2. from p in db.Products
  3. group p by p.CategoryID into g
  4. select new {
  5. g.Key,
  6. MinPrice = g.Min(p => p.UnitPrice)
  7. };

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

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

4.平均值

  1. var q =
  2. from p in db.Products
  3. group p by p.CategoryID into g
  4. select new {
  5. g.Key,
  6. AveragePrice = g.Average(p => p.UnitPrice)
  7. };

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

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

5.求和

  1. var q =
  2. from p in db.Products
  3. group p by p.CategoryID into g
  4. select new {
  5. g.Key,
  6. TotalPrice = g.Sum(p => p.UnitPrice)
  7. };

在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下:

  • 上表是所有政区,商圈中的餐饮个数,名为FoodDistrict
  • 下表是所有政区,商圈中的SPA个数,名为SPADistrict

现在要把这两张表,根据政区和商圈合并,然后相加Counts,根据Counts的总大小排序,统计热门商圈和热门政区。

 group by

在这里仅讨论合并的问题,以演示在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

执行结果为:

group by result 

这里面需要注意的是,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中将两个集合合并有两个方法,UnionConcat,其中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 用法详解

    其中,`GroupBy`方法是LINQ中的一个重要部分,它用于将数据集根据一个或多个键进行分组,以便我们可以对每个分组进行进一步的操作。本文将深入探讨`GroupBy`方法的使用,包括其基本用法、多键分组以及在实际开发中的...

    Linq中GroupBy方法的使用总结.

    Linq 中的 GroupBy 方法是对数据进行分组的操作,通常用于对一个或多个字段进行分组,求其总和、均值等。下面我们来详细介绍 Linq 中 GroupBy 方法的使用。 一、基本使用 在 Linq 中,GroupBy 方法的基本使用方式...

    解决C#中Linq GroupBy 和OrderBy失效的方法

    `GroupBy`操作符是LINQ中的一个关键部分,它允许我们按照一个或多个属性将数据集分组。例如,在给定的代码中,我们看到`GroupBy`被用来根据`TestId`和`TestName`属性对`TeamDto`对象进行分组: ```csharp var ...

    linq标准查询操作符

    除了上述操作符,LINQ还包括其他多种操作符,如`Distinct`用于去除重复元素,`GroupBy`用于按指定键进行分组,`Join`用于连接两个序列,`Average`、`Sum`、`Count`和`Max`、`Min`用于计算数值序列的统计属性等。...

    C# 中的GroupBy的动态拼接问题及GroupBy用法介绍

    废话不多说了,直接给大家贴代码了,具体代码如下所示: public class Person { public string FirstName{set;get;} public string LastName{set;get;} public Person(){} public Person(string firstName, ...

    C#在LINQ中使用GroupBy

    在LINQ中,GroupBy是一个非常重要的操作,它可以将数据分组,以便更好地进行数据分析和处理。本文将介绍C#在LINQ中如何使用GroupBy,帮助大家更好地理解和学习C#。 一、准备要使用的类 在使用GroupBy之前,我们...

    用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT

    用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT

    linq小案例

    另外,如果我们要统计每个用户名的留言数量,可以使用`GroupBy`: ```csharp var userCount = from guest in context.Guests group guest by guest.Username into userGroup select new { Username = userGroup....

    处理group by 查询速度太慢的问题 数据量大.doc

    优化 Group By 查询速度的实践经验 在实际项目中,遇到了表数据量大导致查询速度很慢的问题。通过记录和优化过程,总结出一些有价值的经验,希望能够帮助读者解决类似的问题。 知识点1:Group By 查询的索引设置 ...

    Linq直接操作GridView

    在某些情况下,我们需要去除重复项并选择特定项,可以使用LINQ的`OrderBy`、`GroupBy`和`Select`方法: ```csharp var test4 = GridView1.Rows.OfType() .OrderBy(r =&gt; r.Cells[3].Text) .GroupBy(r =&gt; r.Cells[3...

    C# linq操作xml

    在C#中,LINQ的许多功能是通过扩展方法实现的,如`.Where()`, `.Select()`, `.OrderBy()`, `.GroupBy()`等。这些方法允许我们对查询结果进行过滤、选择、排序和分组等操作。 例如,我们可以使用`.Where()`过滤满足...

    LINQ各种例子操作

    var groupedByAge = customers.GroupBy(cust =&gt; cust.Age); ``` **三、LINQ to XML** LINQ to XML是针对XML文档的查询方式,它提供了更直观、更简洁的API来创建、查询和修改XML。关键操作包括: 1. **创建XML**...

    LINQ操作数据库

    此外,LINQ还支持JOIN、GROUP BY、聚合函数等复杂的查询操作,这些在传统的ADO.NET编程中需要手动编写大量代码。例如,我们可以用以下代码进行多表联接: ```csharp var joinedData = from s in db.Students join ...

    VS2008_LINQ_操作(完整)源码实例

    3. **GroupBy**:用于按一个或多个键对数据进行分组,返回一组键值对,每个键对应一组值。 4. **Join**:用于连接两个集合,基于它们之间的关联。例如,可以联接客户和订单集合,找到每个客户的订单信息。 5. **In...

    linq基础 linq to sql

    本教程主要关注LINQ的基础以及其在SQL数据库操作中的应用——LINQ to SQL。 一、LINQ的基本概念 1. 查询表达式:LINQ引入了一种新的查询语法,类似于SQL,但它是合法的C#或VB代码。这种语法使查询直观且易于理解。 ...

    linq学习基础实例

    LINQ的主要功能包括选择(Select)、过滤(Where)、分组(GroupBy)、排序(OrderBy和ThenBy)、联接(Join)和聚合(Aggregate)等。这些操作在处理数据时非常实用,可以极大地提高开发效率。 1. **选择(Select)*...

    Linq实例代码 Linq的所有实例代码

    4. **其他Linq扩展**:除了基础的Linq用法,Linq还支持更复杂的查询操作,如分组(GroupBy)、连接(Join)、聚合(Aggregate)等。这些高级功能在处理复杂的数据分析任务时非常有用。 学习这些实例代码,可以帮助...

Global site tag (gtag.js) - Google Analytics