C# 之 LINQ的查詢語法

1. LINQ的兩種語法

寫LINQ時有兩種形式的語法:
(1)查詢語法(query syntax)查詢語法是聲明形式的,使用查詢表達式形式來書寫。
(2)方法語法(method syntax)方法語法是命令形式的,它使用的是標準的方法調用。方法是一組叫做標準查詢運算符的方法。

微軟推薦使用查詢語法,因爲它更易讀,能更清晰的表明查詢意圖,因此也不容易出錯。然而,有一些運算符必須使用方法語法來書寫。

所以我們通常在一個查詢中可以使用兩種方法的組合。查詢表達式使用的查詢語法會被C#編譯器轉換爲方法調用的形式、這兩種形式在運行時性能上沒有區別


2. 查詢變量

LINQ查詢可以返回兩種類型的結果:
(1)可枚舉的一組數據,它列出了滿足查詢參數的項列表;
(2)標量,它是滿足查詢條件的結果的某種摘要形式。

		static void Main(string[] args)
        {          
            int[] numberArr = new int[] { 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 };
            Stopwatch sw1 = new Stopwatch();
            sw1.Start();
            //在numberArr表中查找大於等於60的元素
            IEnumerable<int> numRes = from num in numberArr where num >= 60 select num;
            foreach (int i in numRes)
            {
                Console.WriteLine(i);
            }
            sw1.Stop();
            Console.WriteLine("numCount:" + sw1.Elapsed);

            Stopwatch sw = new Stopwatch();
            sw.Start();
            int numCount = (from num in numberArr where num >= 60 select num).Count();
            Console.WriteLine(numCount);
            sw.Stop();

            Console.WriteLine("numCount:" + sw.Elapsed);

            Console.ReadKey();
        }

111

LINQ查詢返回兩種類型結果的差別還在於查詢執行的時間:
(1)如果查詢表達式返回可枚舉的一組數據,查詢一直到處理枚舉時纔會被執行。如果枚舉被處理多次,則查詢會被執行多次;如果在進行便利之後,查詢執行之前數據有改動,則查詢會使用新的數據。
(2)如果查詢表達式返回標量,查詢立刻執行,並且把結果保存在查詢變量中。

3. 查詢表達式的結構

1)from子句

from子句指定了要作爲數據源使用的數據集合。語法格式如下所示:

from 數據類型 迭代變量 in 要查詢的數據源

對from子句的說明如下:
① 迭代變量有序表示數據源的每一個元素;
② 數據類型是集合中元素的類型,數據類型是可選的,因爲編譯器會從集合來自動推斷出迭代變量的類型;
③ 要查詢的集合必須是可以枚舉的。

2)where子句

where子句根據之後的運算來去除不符合指定條件的項。如下所示是where子句的語法:

where 布爾表達式

where子句將布爾表達式,即謂詞,應用於由迭代變量引用的每個源元素,並返回滿足指定條件的元素。

使用where子句需注意以下幾點:
(1)where子句是一種篩選機制,它不能是查詢表達式中的第一個或最後一個子句;
(2)如果where子句中設定的布爾表達式對當前數據源的元素無效,則會發生編譯錯誤;
(3)編譯時,where關鍵字會被轉換爲where標準查詢運算符方法的調用。

3)select子句

select子句指定所選擇的對象那部分應該被選擇。它可以指定下面的任意一項:
(1)整個數據項
(2)數據項的一個字段
(3)數據項中的幾個字段組成的新對象(或類似其他值)

select子句的結果基於前面所有子句的計算結果以及select子
句本身的所有表達式。

查詢表達式必須以 select子句或group子句結束。


4)group子句

group子句是可選的,用來指定選定的項如何被分組。使用
group子句的注意事項如下:
(1)如果項包括在查詢的結果中,就可以根據某個字段的值進行分組。作爲分組依據的項叫做鍵;
(2)group子句不從原始的數據源中返回可枚舉項的枚舉類型,而是返回已經形成的可以枚舉項的分組的可枚舉類型;
(3)分組本身是可枚舉類型,它們可以枚舉實際的項。

使用示例:

 var Persons = new[] { new { Name = "Czhenya", Sex = "男" }, new { Name = "CZY", Sex = "boy" }, new { Name = "CXY_CZY", Sex = "1" } };
 var psoGruop = from pos in Persons group pos by pos.Name;
 foreach (var item in psoGruop)
 {
    Console.WriteLine(item.Key);
    foreach (var i in item)
    {
        Console.WriteLine(i.Name + "..." + i.Sex);
     }               
 }

示例


5)orderby子句

orderby子句接受一個表達式並根據表達式依次返回結果項orderby子句的語法如下所示:
orderby 表達式 [ ascending |descending]]

不寫後綴默認是升序排序方式,
可以有任意多個orderby子句,但是必須使用逗號分割。

var Persons = new[] { new { Name = "Czhenya", Sex = "男", Age = 1 }, new { Name = "CZY", Sex = "boy", Age = 3 }, new { Name = "CXY_CZY", Sex = "1", Age = 2 } };

var shengXu = from pos in Persons orderby pos.Age ascending select pos;
foreach (var i in shengXu)
{
    Console.WriteLine(i.Name + "..." + i.Age);
}

var jiangXu = from pos in Persons orderby pos.Age descending select pos;
foreach (var i in jiangXu)
{
   Console.WriteLine(i.Name + "..." + i.Age);
}

222
上面這個例子使用Age這個字段,也可以使用Name這個字段會根據英文字母排序,若Name有中文也是可以排序的,可以自行嘗試下.


相關推薦:C# 之 LINQ簡析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章