• LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat


    七、聚合操作符

    聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值、最大值等。共有7种LINQ聚合查询操作符:Aggregate、Average、Count、LongCount、Max、Min和Sum。

    1. Aggregate

    Aggregate操作符对集合值执行自定义聚合运算。例如,需要列出所有产品类别清单,每个类别名称之间用顿号连接。以下的代码演示了这一过程:

    复制代码
    //方法语法
                var q =
                    db.Categories
                    .Select(c => c.CategoryName)
                    .ToList()
                    //.ToArray()
                    .Aggregate((current, next) => String.Format("{0}、{1}", current, next));
    复制代码

    从数据库中查询的结果集合:

    Aggregate后得到的结果

    2. Average

    求集合中元素的平均值,返回值类型double

    复制代码
                var list = db.Order_Details
                    .GroupBy(o => o.OrderID)
                    .Select(g => new { key = g.Key, avg = g.Average(x => x.UnitPrice) })
                    .ToList();
    
    生成的sql:
    
    SELECT 
        [GroupBy1].[K1] AS [OrderID], 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            [Extent1].[OrderID] AS [K1], 
            AVG([Extent1].[UnitPrice]) AS [A1]
            FROM [dbo].[Order Details] AS [Extent1]
            GROUP BY [Extent1].[OrderID]
        )  AS [GroupBy1]
    复制代码

    返回的结果:

    3. Count

    求集合中元素的个数,返回值类型Int32

    复制代码
                var list = db.Order_Details
                    .GroupBy(o => o.OrderID)
                    .Select(g => new { key = g.Key, count = g.Count() })
                    .ToList();
    
    生成的sql:
    
    SELECT 
        [GroupBy1].[K1] AS [OrderID], 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            [Extent1].[OrderID] AS [K1], 
            COUNT(1) AS [A1]
            FROM [dbo].[Order Details] AS [Extent1]
            GROUP BY [Extent1].[OrderID]
        )  AS [GroupBy1]
    复制代码

    4. LongCount

    求集合中元素的个数,返回值类型Int64

    5. Max

    求集合中元素的最大值

    复制代码
                var list = db.Order_Details
                    .GroupBy(o => o.OrderID)
                    .Select(g => new { key = g.Key, max = g.Max(x => x.UnitPrice) })
                    .ToList();
    
    生成的sql:
    
    SELECT 
        [GroupBy1].[K1] AS [OrderID], 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            [Extent1].[OrderID] AS [K1], 
            MAX([Extent1].[UnitPrice]) AS [A1]
            FROM [dbo].[Order Details] AS [Extent1]
            GROUP BY [Extent1].[OrderID]
        )  AS [GroupBy1]
    复制代码

    6. Min

    求集合中元素的最小值

    7. Sum

    求集合中元素的和

    八、集合操作符

    LINQ 中的集合操作符是指根据相同或不同集合(或集)中是否存在等效元素来生成结果集的查询操作,一共有4种:

    方法名

    说明

    Distinct

    从集合移除重复值。

    clip_image001

    Except

    返回差集,差集是指位于一个集合但不位于另一个集合的元素。

    clip_image002

    Intersect

    返回交集,交集是指同时出现在两个集合中的元素。

    clip_image003

    Union

    返回并集,并集是指位于两个集合中任一集合的唯一的元素。

    clip_image004

    使用方式均为“集合1.方法名(集合2)”,返回值为运算结果的集合,这里就不演示了。

    九、生成操作符

    生成是指创建新的值序列。

    1. Empty

    Empty操作符返回一个指定类型的空集合。这里的空不是null,而是元素数量为0的集合。以下的示例演示了如何创建一个IEnumerable<int>类型的空集合:

    var q = Enumerable.Empty<int>();  

    2. DefaultIfEmpty

    DefaultIfEmpty将空集合替换为具有默认值的单一实例集合。执行此方法获得的集合将至少含有一个元素,这是因为DefaultIfEmpty方法需要两个参数,第一个参数是一个泛型集合,第二个参数是相应类型的单个元素,如果第一个参数中不含有任何元素,它将返回第二个参数指定的单个元素。如果你使用了DefaultIfEmpty方法的重载方法DefaultIfEmpty<T>(IEnumerable<T> array),如果指定的array集合为空,那么将返回一个类型为T,值为null的单个对象。以下的代码演示了这一过程:

    复制代码
                //方法语法
                var q =
                    Enumerable.DefaultIfEmpty
                    (
                        db.Employees
                        .Where(e => e.FirstName.StartsWith("Aaf")) //更改此处的条件可获得不同的集合,当前条件结果集合为空,所以返回后面的实体对象
                        , new Models.Employee() { FirstName = "Sunny D.D" }
                    ).ToList();
    复制代码

    3. Range

    Range操作符用于生成指定范围内的整数的序列。它需要两个参数,第一个参数是序列开始的整数值,第二个参数是序列中整数的数量。下面的示例演示了使用Range操作符来生成从0到9的整数序列:

    var q = Enumerable.Range(0, 10);

    4. Repeat

    Repeat操作符用于生成包含一个重复值的集合。它需要两个参数,第一个参数是任意类型的元素,第二个参数是生成的序列中所包含此元素的数量。下面的示例演示了使用Repeat来生成一个包含10个0的序列:

    var q = Enumerable.Repeat(0, 10);

  • 相关阅读:
    UVA 12545 Bits Equalizer
    UVA 1610 Party Games
    UVA 1149 Bin Packing
    UVA 1607 Gates
    UVA 12627 Erratic Expansion
    UVA10562-Undraw the Trees(递归)
    UVA10129-Play on Words(欧拉路径)
    UVA816-Abbott's Revenge(搜索进阶)
    UVA1103-Ancient Messages(脑洞+dfs)
    UVA839-Not so Mobile
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/10698255.html
Copyright © 2020-2023  润新知