C#學習筆記(八)—–LINQ查詢的基礎知識(下)

LINQ查詢語法和SQL語法的對比

  • LINQ查詢語法看起來和SQL語法非常相似,但他們完全不同。LINQ查詢表達式是一種C#表達式,遵循C#的語法規則,例如,在LINQ中,變量必須在聲明之後才能使用,與之不同的是在SQL中,select後面可以直接跟列明,而這些列所在的表在稍後的from子句中才能確定。(也就是說from這個子句在LINQ中被放到最前的原因)。
    在LINQ中,一個子查詢實際上就是一個新的C#表達式,因此不需要使用專門的子查詢運算符,而在SQL中,使用子查詢要遵循特殊的語法規則。
    在LINQ查詢過程中,數據的處理順序一直是從左向右進行的;而在SQL中,數據的處理順序是不確定的。
    另外,在LINQ中,在處理數據過程中,集合中的元素始終保持一種有序的狀態;而在SQL的查詢過程中,數據始終是以一種網狀的結構存在,沒有順序的概念。

查詢表達式語法與運算符流語法的區別

這兩個表達式語法各有優勢。
在包含以下運算符的查詢操作中,使用查詢表達式更方便:
①在查詢中使用let子句導入新的查詢變量。
②在查詢中用到SelectMany、Join或者GroupJoin這些運算符。
對於只包含Where、Orderby或者Select的查詢語句,這兩種查詢方式都可以。
一般來說,查詢表達式語法由單個的運算符組成,結構比較清晰;而運算符流語法寫出的代碼相對簡潔。

  • 最後是適合使用運算符流語法書寫的情況,很多查詢運算符在表達式語法中沒有相應的關鍵字,這時只能使用運算符流的方式進行查詢,至少應該部分使用。在不含以下運算符的查詢中,選用運算符流語法進行查詢會更加方便:
Where, Select, SelectMany
OrderBy, ThenBy, OrderByDescending, ThenByDescending
GroupBy, Join, GroupJoin

混合查詢語法

如果一個查詢運算符沒有合適的查詢語法,那麼沃恩可以混合使用量上面介紹的兩種方式來得到最終結果。這樣做的唯一顯示只是,在整個查詢中,每個查詢表達式的表述必須是完整的,例如,必須有from字句開始,select或者group子句結束。
假設有這樣一個數組:

string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

下面這個表達式用於查詢集合names中包含字母a的單詞個數:

int matches = (from n in names where n.Contains ("a") select n).Count();
// 3

下面這個表達式首先對集合進行排序,然後返回排序數組中第一個元素L

string first = (from n in names orderby n select n).First(); // Dick

在比較複雜查詢中,這種混合使用兩種查詢語法進行查詢的放射科非常高效,上面的兩個示例,實際上也可以直接使用運算符流語法進行書寫:

int matches = names.Where (n => n.Contains ("a")).Count(); // 3
string first = names.OrderBy (n => n).First(); // Dick

提示:有時,即使混合使用了兩種查詢語法,也沒有寫出真正簡練的LINQ查詢,但注意不要因此養成只是用一種查詢語法的習慣,如果習慣只使用一種語法形式,在遇到複雜查詢情況時,很難找到一種真正高效的方式去解決問題。

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