LINQ標準查詢操做符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

7、聚合操做符

聚合函數將在序列上執行特定的計算,並返回單個值,如計算給定序列平均值、最大值等。共有7種LINQ聚合查詢操做符:Aggregate、Average、Count、LongCount、Max、Min和Sum。sql

1. Aggregate

Aggregate操做符對集合值執行自定義聚合運算。例如,須要列出全部產品類別清單,每一個類別名稱之間用頓號鏈接。如下的代碼演示了這一過程:數據庫

複製代碼
//方法語法
            var q =
                db.Categories
                .Select(c => c.CategoryName)
                .ToList()
                //.ToArray()
                .Aggregate((current, next) => String.Format("{0}、{1}", current, next));
複製代碼

從數據庫中查詢的結果集合:
函數

Aggregate後獲得的結果spa

2. Average

求集合中元素的平均值,返回值類型doublecode

複製代碼
            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]
複製代碼

返回的結果:
orm

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

求集合中元素的個數,返回值類型Int64blog

5. Max

求集合中元素的最大值ip

複製代碼
            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

求集合中元素的最小值ci

7. Sum

求集合中元素的和

8、集合操做符

LINQ 中的集合操做符是指根據相同或不一樣集合(或集)中是否存在等效元素來生成結果集的查詢操做,一共有4種:

方法名

說明

Distinct

從集合移除重複值。

clip_image001

Except

返回差集,差集是指位於一個集合但不位於另外一個集合的元素。

clip_image002

Intersect

返回交集,交集是指同時出如今兩個集合中的元素。

clip_image003

Union

返回並集,並集是指位於兩個集合中任一集合的惟一的元素。

clip_image004

 

使用方式均爲「集合1.方法名(集合2)」,返回值爲運算結果的集合,這裏就不演示了。

9、生成操做符

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

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);

相關文章
相關標籤/搜索