.NET LINQ概述

 

  • LINQ
     語言集成查詢 (LINQ) 是 Visual Studio 2008 中引入的一組功能,它在對象領域和數據領域之間架起了一座橋樑。可爲 C# 和 Visual Basic 語言語法提供強大的查詢功能。 LINQ 引入了標準、易學的數據查詢和更新模式,該技術可以擴展爲幾乎支持任何類型的數據存儲。Visual Studio 包含 LINQ 提供程序的程序集,藉助這些程序集,就能將 LINQ 用於 .NET Framework 集合、SQL Server 數據庫、ADO.NET 數據集和 XML 文檔。

  • LINQ應用場景
    • LINQ to Object:針對數組和集合
    • LINQ to XML:針對XML文檔
    • LINQ to DataSet:針對ADO的DataSet對象
    • LINQ to Entites:針對EF
    • Parallel LINQ:並行處理LINQ查詢返回的數據

  • LINQ 查詢
     查詢是一種從數據源檢索數據的表達式。 查詢通常用專門的查詢語言來表示。 隨着時間的推移,人們已經爲各種數據源開發了不同的語言;例如,用於關係數據庫的 SQL 和用於 XML 的 XQuery。 因此,開發人員不得不針對他們必須支持的每種數據源或數據格式而學習新的查詢語言。 LINQ 通過提供一種跨各種數據源和數據格式使用數據的一致模型,簡化了這一情況。 在 LINQ 查詢中,始終會用到對象。 可以使用相同的基本編碼模式來查詢和轉換 XML 文檔、SQL 數據庫、ADO.NET 數據集、.NET 集合中的數據以及對其有 LINQ 提供程序可用的任何其他格式的數據。
 
    • 獲取數據源
     LINQ語句是在 foreach 語句中執行查詢,而 foreach 要求使用 IEnumerable 或 IEnumerable<T>。支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的類型稱爲“可查詢類型”。
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
    • 創建查詢
     查詢指定要從數據源中檢索的信息。查詢還可以指定在返回這些信息之前如何對其進行排序、分組和結構化。查詢存儲在查詢變量中,並用查詢表達式進行初始化。
    • 執行查詢
      • 延遲執行
     查詢變量本身只是存儲查詢命令。實際的查詢執行會延遲到在 foreach 語句中循環訪問查詢變量時發生。此概念稱爲“延遲執行”
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}
      • 強制立即執行
     對一系列源元素執行聚合函數的查詢必須首先循環訪問這些元素。 Count、Max、Average 和 First 就屬於此類查詢。由於查詢本身必須使用 foreach 以便返回結果,因此這些查詢在執行時不使用顯式 foreach 語句。另外還要注意,這些類型的查詢返回單個值,而不是 IEnumerable 集合。
var evenNumQuery = 
    from num in numbers
    where (num % 2) == 0
    select num;
int evenNumCount = evenNumQuery.Count();
     若要強制立即執行任意查詢並緩存其結果,可以調用 ToList<TSource> 或 ToArray<TSource> 方法。
List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

  • 支持 LINQ 的功能
    • 查詢表達式
     查詢表達式使用類似於 SQL 或 XQuery 的聲明性語法來查詢 IEnumerable 集合。在編譯時,查詢語法轉換爲對 LINQ 提供程序的標準查詢運算符擴展方法實現的方法調用。應用程序通過使用 using 指令指定適當的命名空間來控制範圍內的標準查詢運算符。下面的查詢表達式獲取一個字符串數組,按字符串中的第一個字符對字符串進行分組,然後對各組進行排序。
var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;
    • 隱式類型化變量
     不必在聲明並初始化變量時顯式指定類型,您可以使用 var 修飾符來指示編譯器推斷並分配類型,聲明爲 var 的變量與顯式指定其類型的變量一樣都是強類型。通過使用 var,可以創建匿名類型,但它可用於任何局部變量。也可以使用隱式類型聲明數組。
var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;
    • 對象和集合初始值設定項
     通過對象和集合初始值設定項,初始化對象時無需爲對象顯式調用構造函數。初始值設定項通常用在將源數據投影到新數據類型的查詢表達式中。假定一個類名爲 Customer,具有公共 Name 和 Phone 屬性,可以按下列代碼中所示使用對象初始值設定項:
Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };
    • 匿名類型
     匿名類型由編譯器構建,且類型名稱只可用於編譯器。匿名類型提供了一種在查詢結果中臨時分組一組屬性的方便方法,無需定義單獨的命名類型。使用新的表達式和對象初始值設定項初始化匿名類型。
select new {name = cust.Name, phone = cust.Phone};
    • 擴展方法
     擴展方法是一種可與類型關聯的靜態方法,因此可以像實例方法那樣對類型調用它。實際上,此功能使您能夠將新方法“添加”到現有類型,而不會實際修改它們。標準查詢運算符是一組擴展方法,它們爲實現 IEnumerable<T> 的任何類型提供 LINQ 查詢功能。
    • Lambda 表達式
     Lambda 表達式是一種內聯函數,該函數使用 => 運算符將輸入參數與函數體分離,並且可以在編譯時轉換爲委託或表達式樹。在 LINQ 編程中,在您對標準查詢運算符進行直接方法調用時,會遇到 lambda 表達式。
    • 自動實現的屬性
     通過自動實現的屬性,可以更簡明地聲明屬性。當您如下面的示例中所示聲明屬性時,編譯器將創建一個私有的匿名支持字段,該字段只能通過屬性 getter 和 setter 進行訪問。
public string Name {get; set;}

  • LINQ 泛型
    •  IEnumerable<T> 變量
     LINQ 查詢變量類型化爲 IEnumerable<T> 或派生類型,如 IQueryable<T>。當您看到類型化爲 IEnumerable<Customer> 的查詢變量時,這隻意味着在執行該查詢時,該查詢將生成包含零個或多個 Customer 對象的序列。
IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;
foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
    • 編譯器處理泛型類型聲明
     如果您願意,可以使用 var 關鍵字來避免使用泛型語法。 var 關鍵字指示編譯器通過查看在 from 子句中指定的數據源來推斷查詢變量的類型。當變量的類型明顯或顯式指定嵌套泛型類型(如由組查詢生成的那些類型)並不重要時,var 關鍵字很有用。通常,我們建議如果您使用 var,應意識到這可能使您的代碼更難以讓別人理解。

var customerQuery2 = 
    from cust in customers
    where cust.City == "London"
    select cust;
foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

  • LINQ to Objects
     術語“LINQ to Objects”是指直接對任意 IEnumerable 或 IEnumerable<T> 集合使用 LINQ 查詢,無需使用中間 LINQ 提供程序或 API,如 LINQ to SQL 或 LINQ to XML。 可以使用 LINQ 來查詢任何可枚舉的集合,如 List<T>、Array 或 Dictionary<TKey, TValue>。 該集合可以是用戶定義的集合,也可以是 .NET Framework API 返回的集合。
     從根本上說,LINQ to Objects 表示一種新的處理集合的方法。 採用舊方法,您必須編寫指定如何從集合檢索數據的複雜的 foreach 循環。 而採用 LINQ 方法,您只需編寫描述要檢索的內容的聲明性代碼。
     另外,與傳統的 foreach 循環相比,LINQ 查詢具有三大優勢:
    • 它們更簡明、更易讀,尤其在篩選多個條件時。
    • 它們使用最少的應用程序代碼提供強大的篩選、排序和分組功能。
    • 無需修改或只需做很小的修改即可將它們移植到其他數據源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章