Linq學習第一天


概述

LINQ,語言集成查詢(Language INtegrated Query)是一組用於c#和Visual Basic語言的擴展。它允許編寫C#或者Visual Basic代碼以查詢數據庫相同的方式操作內存數據。LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#)中。使用這些操作可以編寫查詢語句。不過,這些查詢還可以基於很多類型的數據,每個數據類型都需要一個單獨的LINQ類型。在 Visual Studio 中,可以用 Visual Basic 或 C# 為以下數據源編寫 LINQ 查詢:SQL Server 數據庫、XML 文檔、ADO.NET 數據集,以及支持IEnumeable 或泛型IEnumeable(Of T)接口的任意對象集合。 此外,還計划了對 ADO.NET Entity Framework 的 LINQ 支持,並且第三方為許多 Web 服務和其他數據庫實現編寫了 LINQ 提供程序。LINQ 查詢既可在新項目中使用,也可在現有項目中與非 LINQ 查詢一起使用。 唯一的要求是項目應面向 .NET Framework 3.5 或更高版本。

 

 

查詢操作三部分

所有 LINQ 查詢操作都由以下三個不同的操作組成:1.獲取數據源。2.創建查詢。3.執行查詢。下面示例代表着1,2,3

 1 class IntroToLINQ
 2 {        
 3     static void Main()
 4     {
 5         // The Three Parts of a LINQ Query:
 6         //  1. Data source.
 7         int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
 8 
 9         // 2. Query creation.
10         // numQuery is an IEnumerable<int>
11         var numQuery =
12             from num in numbers
13             where (num % 2) == 0
14             select num;
15 
16         // 3. Query execution.
17         foreach (int num in numQuery)
18         {
19             Console.Write("{0,1} ", num);
20         }
21     }
22 }

  下圖是完整的查詢過程

在上例中由於數據源是數組,數組隱式支持了IEnumerable(Of T)

 

 

數據源

可查詢類型不需要進行修改或特殊處理就可以用作 LINQ 數據源。 如果源數據還沒有作為可查詢類型出現在內存中,則 LINQ 提供程序必須以此方式表示源數據。 例如,LINQ to XML 將 XML 文檔加載到可查詢的 XElement 類型中:

1 // Create a data source from an XML document.
2 // using System.Xml.Linq;
3 XElement contacts = XElement.Load(@"c:\myContactList.xml");

  支持非泛型IEnumeable接口的類型(如 ArrayList)也可用作 LINQ 數據源。

 

 

查詢

查詢指定要從數據源中檢索的信息。 查詢還可以指定在返回這些信息之前如何對其進行排序、分組和結構化。 查詢存儲在查詢變量中,並用查詢表達式進行初始化。 為使編寫查詢的工作變得更加容易,C# 引入了新的查詢語法。

 

上一個示例中的查詢從整數數組中返回所有偶數。 該查詢表達式包含三個子句:fromwhereselect (如果您熟悉 SQL,您會注意到這些子句的順序與 SQL 中的順序相反。)from 子句指定數據源,where 子句應用篩選器,select 子句指定返回的元素的類型。 LINQ 查詢表達式(C# 編程指南)一節中詳細討論了這些子句和其他查詢子句。 目前需要注意的是,在 LINQ 中,查詢變量本身不執行任何操作並且不返回任何數據。 它只是存儲在以后某個時刻執行查詢時為生成結果而必需的信息。 有關在幕后是如何構建查詢的更多信息,請參見標准查詢運算符概述

 

延遲執行

 

如前所述,查詢變量本身只是存儲查詢命令。 實際的查詢執行會延遲到在 foreach 語句中循環訪問查詢變量時發生。 此概念稱為“延遲執行”,下面的示例對此進行了演示:

 

 

1 //  Query execution. 
2 foreach (int num in numQuery)
3 {
4     Console.Write("{0,1} ", num);
5 }

 

foreach 語句也是檢索查詢結果的地方。 例如,在上一個查詢中,迭代變量 num 保存了返回的序列中的每個值(一次保存一個值)。

由於查詢變量本身從不保存查詢結果,因此可以根據需要隨意執行查詢。 例如,可以通過一個單獨的應用程序持續更新數據庫。 在應用程序中,可以創建一個檢索最新數據的查詢,並可以按某一時間間隔反復執行該查詢以便每次檢索不同的結果。

 

 

強制立即執行

對一系列源元素執行聚合函數的查詢必須首先循環訪問這些元素。 CountMaxAverageFirst 就屬於此類查詢。 由於查詢本身必須使用 foreach 以便返回結果,因此這些查詢在執行時不使用顯式 foreach 語句。 另外還要注意,這些類型的查詢返回單個值,而不是 IEnumerable 集合。 下面的查詢返回源數組中偶數的計數:

1 var evenNumQuery = 
2     from num in numbers
3     where (num % 2) == 0
4     select num;
5 
6 int evenNumCount = evenNumQuery.Count();

 若要強制立即執行任意查詢並緩存其結果,可以調用 ToList(Of TSource)    或 ToArray(Of TSource)方法。

 1 List<int> numQuery2 =
 2     (from num in numbers
 3      where (num % 2) == 0
 4      select num).ToList();
 5 
 6 // or like this:
 7 // numQuery3 is still an int[]
 8 
 9 var numQuery3 =
10     (from num in numbers
11      where (num % 2) == 0
12      select num).ToArray();

 此外,還可以通過在緊跟查詢表達式之后的位置放置一個 foreach 循環來強制執行查詢。 但是,通過調用 ToListToArray,也可以將所有數據緩存在單個集合對象中。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM