開始使用 LINQ (二)- 基本 LINQ 查詢操作 一、獲取數據源:from 在 LINQ 查詢中,第一步是指定數據源。像在大多數編程語言中一樣,在 C# 中,必須先聲明變數,才能使用它。在 LINQ 查詢中,最先使用 from 子句的目的是引入數據源 (customers) 和範圍變數 (cu ...
開始使用 LINQ (二)- 基本 LINQ 查詢操作
一、獲取數據源:from
在 LINQ 查詢中,第一步是指定數據源。像在大多數編程語言中一樣,在 C# 中,必須先聲明變數,才能使用它。在 LINQ 查詢中,最先使用 from 子句的目的是引入數據源 (customers) 和範圍變數 (cust)。
1 //queryAllCustomers 是 IEnumerable<Cutsomer> 類型 2 var queryAllCustomers = from cust in customers 3 select cust;
範圍變數類似於 foreach 迴圈中的迭代變數,但在查詢表達式中,實際上不發生迭代。執行查詢時,範圍變數將用作對 customers 中的每個後續元素的引用。因為編譯器可以推斷 cust 的類型,所以您不必顯式指定此類型。
二、篩選:where
也許最常用的查詢操作是應用布爾表達式形式的篩選器。此篩選器使查詢只返回那些表達式結果為 true 的元素。使用 where 子句生成結果。實際上,篩選器指定從源序列中排除哪些元素。
在下麵的示例中,只返回那些地址位於倫敦的 customers。
1 var queryLondonCustomers = from cust in customers 2 where cust.City = "London" 3 select cust;
您可以使用熟悉的 C# 邏輯 AND(&&)和 OR(||) 運算符來根據需要在 where 子句中應用任意數量的篩選表達式。 例如,若要只返回位於“倫敦”和姓名為“Devon”的客戶:
1 where cust.City = "London" && cust.Name = "Devon"
若要返回位於倫敦或巴黎的客戶:
1 where cust.City = "London" || cust.Name = "Paris"
三、排序:orderby
通常可以很方便地將返回的數據進行排序。orderby 子句將使返回的序列中的元素按照被排序的類型的預設比較器進行排序。例如,下麵的查詢可以擴展為按 Name 屬性對結果進行排序。因為 Name 是一個字元串,所以預設比較器執行從 A 到 Z 的字母排序。1 var queryLondonCustomers = from cust in customers 2 where cust.City = "London" 3 orderby cust.Name descending 4 select cust;
若要按相反順序(從 Z 到 A)對結果進行排序,請使用 orderby…descending 子句。
四、分組:group
使用 group 子句,您可以按指定的鍵分組結果。例如,您可以指定結果應按 City 分組,以便位於倫敦或巴黎的所有客戶位於各自組中。在本例中,cust.City 是鍵。
1 var queryLondonCustomers = from cust in customers 2 group cust by cust.City; 3 4 foreach (var queryLondonCustomer in queryLondonCustomers) 5 { 6 Console.WriteLine(queryLondonCustomer.Key); 7 foreach (var cust in queryLondonCustomer) 8 { 9 Console.WriteLine(cust.Name); 10 } 11 }
在使用 group 子句結束查詢時,結果採用列表的列表形式。列表中的每個元素是一個具有 Key 成員及根據該鍵分組的元素列表的對象。在迴圈訪問生成組序列的查詢時,您必須使用嵌套的 foreach 迴圈。外部迴圈用於迴圈訪問每個組,內部迴圈用於迴圈訪問每個組的成員。
如果您必須引用組操作的結果,可以使用 into 關鍵字來創建可進一步查詢的標識符。 下麵的查詢只返回那些包含兩個以上的客戶的組:
1 //custQuery 是 IEnumable<IGrouping<string, Customer>> 類型 2 var custQuery = from cust in customers 3 group cust by cust.City 4 into custGroup 5 where custGroup.Count() > 2 6 orderby custGroup.Key 7 select custGroup;
五、聯接:join
聯接運算創建數據源中沒有顯式建模的序列之間的關聯。例如,您可以執行聯接來查找位於同一地點的所有客戶和經銷商。在 LINQ 中,join 子句始終針對對象集合而非直接針對資料庫表運行。
1 var innerJoinQuery = from cust in customers 2 join dist in distributors on cust.City equals dist.City 3 select new {CustomerName = cust.Name, DistributorName = dist.Name};
在 LINQ 中,您不必像在 SQL 中那樣頻繁使用 join,因為 LINQ 中的外鍵在對象模型中表示為包含項集合的屬性。例如,Customer 對象包含 Order 對象的集合。不必執行聯接,只需使用點表示法訪問訂單:
1 from order in Customer.Orders...
六、選擇(投影):select
select 子句生成查詢結果並指定每個返回的元素的“形狀”或類型。例如,您可以指定結果包含的是整個 Customer 對象、僅一個成員、成員的子集,還是某個基於計算或新對象創建的完全不同的結果類型。當 select 子句生成除源元素副本以外的內容時,該操作稱為“投影”。