LING提供了一種從數據源中獲取數據的方式,不同的語言已經形成了很多種關聯的數據源。LING(Language Integrated Query,語言集成查詢)提供一種通用的從不同的數據源中獲取數據的通用方式。
LING操作的三個基本要素
所有的LING語句都由三部分組成,它們分別是獲取數據源、創建查詢語句、執行查詢語句。
下面是一個簡單的案例:
class IntroToLINQ { static void Main() { // The Three Parts of a LINQ Query: // 1. Data source. int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Query creation. // numQuery is an IEnumerable<int> var numQuery = from num in numbers where (num % 2) == 0 select num; // 3. Query execution. foreach (int num in numQuery) { Console.Write("{0,1} ", num); } } }
下面的圖驗證了完整的執行操作,在LING的查詢和平常的查詢概念不同。LING中創建查詢變量是不會獲取任何實際的數據,這一點在后面會詳細介紹。
獲取數據源
LING語句的數據源必須是 IEnumerable或IEnumerable<E>接口的實現類,上面的int[]數組隱式實現了IEnumerable<E>接口,所以可以使用LING語句。
除了可以LING指定已經加載內存中的數據源,也可以為LING指定還未加載到內存中的數據源,下面使用LING to XML加載一個XML文檔到內存中:
// Create a data source from an XML document. // using System.Xml.Linq; XElement contacts = XElement.Load(@"c:\myContactList.xml");
或者使用LING to db 加載一個數據庫文件到內存中:
Northwnd db = new Northwnd(@"c:\northwnd.mdf"); // Query for customers in London. IQueryable<Customer> custQuery = from cust in db.Customers where cust.City == "London" select cust;
創建查詢語句
查詢語句指定了從數據源獲取數據源的方式,一般情況下也應該指定數據的排序方式,分組方式或是結構化處理。
上面的查詢操作是從一個Int數據中返回數據,其查詢語句一共使用了三個從句:from,where,select。from從句指定查詢的數據源,where從句使用過濾語句,select從句指定返回語句。
注意:查詢變量本身不產生任何實際的查詢操作也不會返回任何數據,它僅僅是存儲查詢的語句。可以通過在代碼調試來驗證這一點。
執行查詢操作
延遲執行
在上面的案例中,查詢變量僅僅是存儲查詢的命令,實際的查詢操作是對這個查詢變量進行迭代操作。這就是LING的延遲執行。上面的案例中,實際的查詢操作是:
foreach (int num in numQuery) { Console.Write("{0,1} ", num); }
這里foreach就是獲取查詢結果的地方,其中num就代表從查詢結果中獲取到值。
因為查詢變量不會存儲任何任何查詢結果,所以可以多次執行這個查詢變量。比如,有一個數據庫可能被不同的應用連續進行更新操作。或者,在一個應用程序中先創建查詢語句然后晚些再執行它。或者,可以在間隔時間內執行相同的查詢語句獲得不同的查詢結果。
立即執行
LING對查詢提供了聚集函數的功能,使用這些功能時首先必須循環訪問這些元素。這些聚集函數有:Count,Max,Average和First。因為查詢本身使用foreach返回查詢結果,因此這些函數都不需要顯式foreach語句。使用這些函數查詢返回的是單個值,不是一個IEnumerable集合。
var evenNumQuery = from num in numbers where (num % 2) == 0 select num; int evenNumCount = evenNumQuery.Count();
若要強制執行並返回緩存查詢的結果,可以調用ToList和ToArray方法。
List<int> numQuery2 = (from num in numbers where (num % 2) == 0 select num).ToList(); // or like this: // numQuery3 is still an int[] var numQuery3 = (from num in numbers where (num % 2) == 0 select num).ToArray();
原文鏈接:
