`
chungle
  • 浏览: 59988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LINQ to SQL语句(6)之Group By/Having

阅读更多

Group By/Having操作符

适用场景:分组数据,为我们查找数据缩小范围。

说明:分配并返回对传入参数进行分组操作后的可枚举对象。分组;延迟

1.简单形式:

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select g;

语句描述:使用Group By按CategoryID划分产品。

说明:from p in db.Products 表示从表中将产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段归类。其结果命名为g,一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。当然,也不必重新命名可以这样写:

var q =
    from p in db.Products
    group p by p.CategoryID;

我们用示意图表示:

GroupBy分组统计示意图

如果想遍历某类别中所有记录,这样:

foreach (var gp in q)
{
    if (gp.Key == 2)
    {
        foreach (var item in gp)
        {
            //do something
        }
    }
}

2.Select匿名类:

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new { CategoryID = g.Key, g }; 

说明:在这句LINQ语句中,有2个property:CategoryID和g。这个匿名类,其实质是对返回结果集重新进行了包装。把g的property封装成一个完整的分组。如下图所示:

GroupBy分组匿名类示意图

如果想遍历某匿名类中所有记录,要这么做:

foreach (var gp in q)
{
    if (gp.CategoryID == 2)
    {
        foreach (var item in gp.g)
        {
            //do something
        }
    }
}

3.最大值

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        MaxPrice = g.Max(p => p.UnitPrice)
    };

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

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

4.最小值

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        MinPrice = g.Min(p => p.UnitPrice)
    };

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

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

5.平均值

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        AveragePrice = g.Average(p => p.UnitPrice)
    };

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

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

6.求和

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        TotalPrice = g.Sum(p => p.UnitPrice)
    };

语句描述:使用Group By和Sum得到每个CategoryID 的单价总计。

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

7.计数

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        NumProducts = g.Count()
    };

语句描述:使用Group By和Count得到每个CategoryID中产品的数量。

说明:先按CategoryID归类,取出CategoryID值和各个分类产品的数量。

8.带条件计数

var q =
    from p in db.Products
    group p by p.CategoryID into g
    select new {
        g.Key,
        NumProducts = g.Count(p => p.Discontinued)
    };

语句描述:使用Group By和Count得到每个CategoryID中断货产品的数量。

说明:先按CategoryID归类,取出CategoryID值和各个分类产品的断货数量。 Count函数里,使用了Lambda表达式,Lambda表达式中的p,代表这个组里的一个元素或对象,即某一个产品。

9.Where限制

var q =
    from p in db.Products
    group p by p.CategoryID into g
    where g.Count() >= 10
    select new {
        g.Key,
        ProductCount = g.Count()
    };

语句描述:根据产品的―ID分组,查询产品数量大于10的ID和产品数量。这个示例在Group By子句后使用Where子句查找所有至少有10种产品的类别。

说明:在翻译成SQL语句时,在最外层嵌套了Where条件。

10.多列(Multiple Columns)

var categories =
    from p in db.Products
    group p by new
    {
        p.CategoryID,
        p.SupplierID
    }
        into g
        select new
            {
                g.Key,
                g
            };

语句描述:使用Group By按CategoryID和SupplierID将产品分组。

说明:既按产品的分类,又按供应商分类。在by后面,new出来一个匿名类。这里,Key其实质是一个类的对象,Key包含两个Property:CategoryID、SupplierID。用g.Key.CategoryID可以遍历CategoryID的值。

11.表达式(Expression)

var categories =
    from p in db.Products
    group p by new { Criterion = p.UnitPrice > 10 } into g
    select g;

语句描述:使用Group By返回两个产品序列。第一个序列包含单价大于10的产品。第二个序列包含单价小于或等于10的产品。

说明:按产品单价是否大于10分类。其结果分为两类,大于的是一类,小于及等于为另一类。

分享到:
评论

相关推荐

    LINQ_to_SQL语法及实例大全

    6. LINQ to SQL语句之GroupBy/Having:GroupBy操作符用于对数据进行分组,而Having则用于在分组的基础上进行条件筛选。它们可以用于实现数据的聚合操作,包括计算最大值、最小值、平均值、求和和计数等。 7. LINQ ...

    LINQ_TO_SQL_高级查询介绍

    在本篇中,我们将深入探讨如何使用LINQ to SQL执行高级查询,特别是`Order By`和`Group By`操作。 **1. `Order By`操作** `Order By`操作用于对查询结果进行排序。在C#中,我们可以使用`orderby`关键字来实现这...

    linq to sql中文教程

    **LINQ to SQL**是Microsoft .NET Framework中的一个组件,它提供了一种将数据从数据库映射到内存中的对象的方式,允许开发人员使用面向对象的编程语言(如C#或VB.NET)来操作数据库,而无需编写SQL语句。...

    linq体验,linq基础学习

    "LINQ体验(7)——LINQ to SQL语句之Group By、Having和Exists、In、Any、All、Contains.docx"深入讲解了更复杂的查询操作,如分组(Group By)、基于分组条件的过滤(Having)、存在性检查(Exists)、成员关系测试...

    LINQ_TO_SQL 文档

    通过一系列文章,作者详细介绍了如何使用LINQ to SQL进行基础和高级查询操作,包括Where、Select、Distinct、Count、Sum、Min、Max、Avg、Join、Order By、Group By、Having、Exists、In、Any、All、Contains、Union...

    Linq_to_SQL

    LINQ_to_SQL是.NET框架中的一个组件,它支持对象关系映射(ORM),允许开发者以面向对象的方式操作数据库,从而不需要写SQL语句。Linq_to_SQL的主要知识点包括它的核心操作和对应的语法实例,以下是对给定文件中提及...

    LINQ_TO_SQL语法与实例大全

    **LINQ_TO_SQL**是一种用于Microsoft .NET Framework的技术,它允许开发人员使用面向对象的方式来进行数据库的操作,而无需编写复杂的SQL语句。LINQ_TO_SQL提供了一种简洁的方法来执行常见的数据操作,如查询、插入...

    Linq体验系列文章打包

    6. **组操作**:`Group By`、`Having`、`Exists`、`In`、`Any`、`All`和`Contains`这些关键字都是用于对数据进行分组、过滤和统计的,它们在数据处理中扮演着重要角色。 7. **动态查询**:`动态查询`可能介绍了如何...

    典型SQL练习题

    5. **分组与分组函数**:GROUP BY用于将数据分组,HAVING用于对分组后的数据进行筛选。 6. **排序与分页**:ORDER BY用于排序结果,LIMIT或OFFSET用于实现分页。 7. **集合操作**:UNION、INTERSECT和EXCEPT用于...

    C# 2008 数据库分组条件查询代码

    首先,我们需要了解SQL语句中的GROUP BY子句。在SQL中,GROUP BY用于将数据表中的数据按一个或多个列进行分组,以便我们可以对每个组执行聚合函数,如COUNT(), SUM(), AVG(), MAX()和MIN()。在C#中,我们可以使用ADO...

    C Sharp LinQ

    #### 二、LINQ to SQL语句详解 ##### 1. Where操作 - **简单形式**:`var result = from p in db.Products where p.UnitPrice > 5 select p;` - 这里`db.Products`是一个包含所有产品的集合,`p.UnitPrice > 5`是...

    LINQtoSQL语法及实例大全

    ### LINQtoSQL语句(6)之GroupBy/Having 用于对数据进行分组和进一步筛选。 - **简单形式**:如`var groupedResults = from p in db.Products group p by p.Category into g select new { Category = g.Key, Count ...

    asp.net+sql

    - LINQ to SQL:一种编程语法,允许在C#或VB.NET中直接书写查询,与SQL语句等效,提高了代码可读性和维护性。 5. 实例源代码: 这个压缩包很可能包含了一个完整的Web应用项目,可能包括数据库脚本、ASP.NET页面...

    SQL和VS混合作业

    - 基本查询:SELECT语句用于检索数据,WHERE子句用于设定查询条件,GROUP BY和HAVING用于数据分组,ORDER BY用于排序结果。 2. **Visual Studio与SQL集成**: - ADO.NET:Visual Studio支持ADO.NET框架,它提供了...

Global site tag (gtag.js) - Google Analytics