開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法 在表示語言集成查詢 (LINQ) 使用 LINQ 性查詢語法,文檔中的多數查詢編寫。但是,編譯代碼時,必須將查詢語法轉換為方法,這就需要 .NET 公共語言運行時 (CLR)。這些方法調用標準查詢運算符的名稱類似 Where、Select ...
開始使用 LINQ(五)- LINQ 中的查詢語法和方法語法
在表示語言集成查詢 (LINQ) 使用 LINQ 性查詢語法,文檔中的多數查詢編寫。但是,編譯代碼時,必須將查詢語法轉換為方法,這就需要 .NET 公共語言運行時 (CLR)。這些方法調用標準查詢運算符的名稱類似 Where、Select、GroupBy、Join、Max和 Average。可以調用這些方法直接使用方法語法而不是查詢語法。
查詢語法和方法語法語義相同,但是,許多人員發現查詢語法更簡單、更易於閱讀。某些查詢必須表示為方法調用。例如,必須使用方法調用表示檢索元素的數量與指定的條件的查詢。還必須使用方法需要檢索元素的最大值在源序列的查詢。System.Linq 命名空間中的標準查詢運算符的參考文檔通常使用方法語法。
一、標準查詢運算符擴展方法
下麵的示例演示簡單的查詢表達式和編寫為基於方法的查詢的語義上等效的查詢。1 static void Main(string[] args) 2 { 3 var nums = new int[4] { 1, 2, 3, 4 }; 4 5 var qureyNums = from n in nums 6 where n % 2 == 0 7 orderby n descending 8 select n; 9 10 Console.WriteLine("qureyNums:"); 11 foreach (var n in qureyNums) 12 { 13 Console.WriteLine(n); 14 } 15 16 var queryNums2 = nums.Where(n => n % 2 == 0).OrderByDescending(n => n); 17 Console.WriteLine("qureyNums2:"); 18 foreach (var n in queryNums2) 19 { 20 Console.WriteLine(n); 21 } 22 23 Console.Read(); 24 }
兩個示例的輸出是相同的。 您可以看到兩種形式的查詢變數的類型是相同的:IEnumerable<T>。
若要瞭解基於方法的查詢,讓我們進一步地分析它。註意,在表達式的右側,where 子句現在表示為對 numbers 對象的實例方法,在您重新調用該對象時其類型為 IEnumerable<int>。如果您熟悉泛型 IEnumerable<T> 介面,那麼您就會瞭解,它不具有 Where 方法。但是,如果您在 Visual Studio IDE 中調用 IntelliSense 完成列表,那麼您不僅將看到 Where 方法,而且還會看到許多其他方法,如 Select、SelectMany、Join 和Orderby。下麵是所有標準查詢運算符。儘管看起來 IEnumerable<T> 似乎已被重新定義以包括這些附加方法,但事實上並非如此。這些標準查詢運算符都是作為“擴展方法”實現的。
二、Lambda 表達式
在前面的示例中,通知該條件表達式 (num % 2 == 0) 是作為內聯參數。Where 方法:Where(num => num % 2 == 0).此內聯表達式稱為 lambda 表達式。將代碼編寫為匿名方法或泛型委托或表達式樹是一種便捷的方法,否則編寫起來就要麻煩得多。在 C# 中,=> 是 lambda 運算符,可讀為“goes to”。運算符左側的 num 是輸入變數,與查詢表達式中的 num 相對應。編譯器可推斷 num 的類型,因為它瞭解 numbers 是泛型 IEnumerable<T> 類型。lambda 表達式與查詢語法中的表達式或任何其他 C# 表達式或語句中的表達式相同;它可以包括方法調用和其他複雜邏輯。“返回值”就是表達式結果。三、查詢的組合性
在上面的代碼示例中,請註意 OrderBy 方法是通過在對 Where 的調用中使用點運算符來調用的。Where 生成篩選序列,然後 Orderby 通過對該序列排序來對它進行操作。因為查詢會返回 IEnumerable,所以您可通過將方法調用鏈接在一起,在方法語法中將這些查詢組合起來。這就是在您通過使用查詢語法編寫查詢時編譯器在後臺所執行的操作。並且由於查詢變數不存儲查詢的結果,因此您可以隨時修改它或將它用作新查詢的基礎,即使在執行它後。【來源】本文文字和部分圖片主要摘自微軟官方文檔。