LINQ入門教程之各類標準查詢操做符(一)

 

很久以前就想系統的學習下LINQ,很久以前……html

本篇文章主要介紹LINQ等的標準查詢操做符,內容取自《LINQ高級編程》,後續還會介紹LINQ to XML ,LINQ to SQL。編程

LINQ入門教程之各類標準查詢操做符(一)ide

LINQ入門教程之各類標準查詢操做符(二)post

進入正題學習

(一)先介紹下標準查詢操做符的概念url

它是一系列方法的集合,如常見的Select 、Where、OrderBy等,這些方法做用於序列(集合)之上,序列是一個實現了IEnumerable<T>接口或IQueryable<T>接口的類型的對象。spa

IEnumerable和IQueryable的一個區別是:IEnumerable接口提供了向前遍歷的功能。它不具有在各個數據項之間移動(向前移動除外)的能力。IQueryalbe能夠使查詢操做更具靈活性。3d

通俗的講查詢操做符是用好linq的基本,就像砍材要用的刀同樣……code

(二)另外再說下 查詢語法和方法語法的概念htm

查詢語法 即用查詢表達式來編寫查詢。 如代碼:

1 int[] data={1,2,3,4};
2 IEnumerable<int> query = from da in data where da > 2 select da;

那方法語法呢 如代碼:

1 int[] data={1,2,3,4};
2 IEnumerable<int> query2 = data.Select(o => o).Where(d => d > 2);

LINQ在編譯的時候,查詢語法將會轉爲方法語法。相對而言,查詢語法更容易閱讀、理解和維護

(三)各類查詢操做符彙總列表 

標準查詢操做符 (方法語法)  查詢表達式(查詢語法)
 All(Of T)  N/A
 Any  N/A
Average   N/A
Cast(Of T)   An explicit range of variables
Count  N/A
Distinct   N/A
GroupBy   group by
GroupJoin   join…in…on…into
Join   join…in…on…equals…
LongCount   N/A
Max   N/A
Min   N/A
OrderBy  order by
OrderByDescending   order by descending
Select   select
SelectMany   Multiple from clauses
Skip   N/A
SkipWhile   N/A
Sum   N/A
Take   N/A
TakeWhile    N/A
ThenBy       order by
ThenByDescending   order by descending
Where   where

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 備註:N/A (Not Applicable 不適用的)

(四) 下面主要經過代碼來說解各個標準查詢操做符。

1.  投影操做符 (Select  SelectMany)

 1   #region  投影操做符 將序列中的元素轉換爲一個由開發人員定義的形式的操做
 2        /// <summary>
 3        /// 對單個序列或集合中的值進行投影
 4        /// </summary>
 5         static void SelectFunction()
 6         {
 7             DataContext contexts = new DataContext("Initial Catalog=AdventureWorks; Integrated Security=true");
 8             Table<Contact> contacts = contexts.GetTable<Contact>();
 9             //查詢語法
10             var query = from c in contacts where c.FirstName  == "gong"  select new { c.FirstName };
11             //方法語法
12             query = contacts.Select(o => new { o.FirstName }).Where(c => c.FirstName == "gong");
13             foreach (var item in query)
14             {
15                 Console.WriteLine(item.FirstName);
16             }
17         }
18         //output:
19         //Gong
20         //Gong
21         class name{ public List<string> pets; public string FirstName;}
22         /// <summary>
23         /// selectMany 提供了將多個from子句組合起來的功能,它將每一個對象的結果合併成單個序列
24         /// </summary>
25         static void SelectManyFunction( )
26         {
27           //List<name> list =new List<name>() { 
28           name[] list =new name[] { 
29               new name{ FirstName="Gwt",pets=new List<string>{"TEST"} }  ,
30               new name{ FirstName="Gwt1",pets=new List<string>{"TEST4","Test41"} }, 
31           };
32           //將全部List<string> 合併
33             IEnumerable<string> query = list.SelectMany(own => own.pets);
34           foreach (string item in query)
35           {
36               Console.Write(item +" ");
37           }
38           Console.WriteLine("");
39           //下面這個循環等於上面的seletmany方法
40             var query2 = list.Select(own => own.pets);
41           foreach (var item in query2)
42           {
43               foreach (var item2 in item)
44               {
45                   Console.Write(item2+" ");
46               }
47           }
48         }
49         //output:
50         // TEST TEST4 TEST41
51         // TEST TEST4 TEST41
View Code

 

2.  限制操做符 (Where)

 1     #region  限制操做符
 2         /// <summary>
 3         /// where操做符不啓動查詢的執行,當開始對對象進行枚舉時查詢纔開始執行
 4         /// </summary>
 5         static void WhereFunction()
 6         {
 7             int[] numbers = { 1,2,3,4,5,6};
 8             IEnumerable<int> query = numbers.Select(o => o).Where(o => o > 3);
 9             foreach (int item in query)
10             {
11                 Console.Write(item+" ");
12             }
13         }
14         //output;
15         //4 5 6
16         #endregion
View Code

 

3.  排序操做符 (OrderBy OrderByDescending ThenBy ThenByDescending Reverse)

 1      #region  排序操做符 
 2         /// <summary>
 3         /// OrderBy/OrderByDescending     對應提供了按照升序/降序的方式對結果進行排序的功能
 4         /// ThenBy/ThenByDescending        實現按照次關鍵字對序列進行升序/降序排列
 5         /// </summary>
 6         static void OrderByFunction()
 7         {
 8             DataContext context = new DataContext(StaticData.ConnectSql);
 9             Table<Contact> contacts = context.GetTable<Contact>( );
10             IEnumerable<Contact> query = contacts.Select(o => o).OrderBy(o => o.FirstName).ThenBy(o => o.LastName);
11         
12             foreach (Contact item in query)
13             {
14                 Console.WriteLine(item.FirstName + " " + item.LastName);
15             }
16             Console.WriteLine();
17             query = contacts.Select(o => o).OrderByDescending(o => o.FirstName).ThenByDescending(o => o.LastName);
18             foreach (Contact item in query)
19             {
20                 Console.WriteLine(item.FirstName + " " + item.LastName);
21             }
22         }
23         //output:
24         //Gong tao
25         //Gong taos
26         //gong2 tao2
27         //gong3 tao3
28         //gong4 tao4
29         //gong5 tao5
30         //
31         //gong5 tao5
32         //gong4 tao4
33         //gong3 tao3
34         //gong2 tao2
35         //Gong taos
36         //Gong tao
37         /// <summary>
38         /// Reverse 把數據源的數據按相反的順序返回
39         /// </summary>
40         static void ReverseFunction()
41         {
42             int[] numbers = { 1,2,3,4,5};
43             IEnumerable<int> query = numbers.Reverse();
44             foreach (int item in query)
45             {
46                 Console.Write(item+"  ");
47             }
48         }
49         //output:
50         //5 4 3 2 1
51         #endregion 
View Code

 

4.  聯接操做符 (Join GroupJoin)

 1   #region  聯接操做符
 2         /// <summary>
 3         /// join 至關於T-SQL中的inner join 
 4         /// </summary>
 5         static void JoinFunction()
 6         {
 7             DataContext context = new DataContext(StaticData.ConnectSql);
 8             Table<Contact> contact = context.GetTable<Contact>();
 9             Table<Employee> employee = context.GetTable<Employee>();
10             //方法語法
11             var query = contact.Join(employee, con => con.ContactID, emp => emp.ContactID,
12                 (con, emp) => new { ContactName = con.FirstName, emp })
13                 .Where(con=>con.ContactName=="gong2");
14             //查詢語法
15             query = from con in contact
16                     join emp in employee on con.ContactID equals emp.ContactID 
17                     where con.FirstName=="gong2"
18                      select new { ContactName = con.FirstName, emp } ; 
19             foreach (var item in query)
20             {
21                 Console.WriteLine(item.ContactName + "  " + item.emp.EmployeeID);
22             }
23         }
24         //output:
25         //gong2  23
26         //gong2  24
27         //gong2  25
28         //gong2  26
29         class Team
30         {
31             public string TeamName; 
32         }
33         class Rider
34         {
35             public string Name;
36             public string TeamName;
37         }
38         /// <summary>
39         /// GroupJoin  
40         /// </summary>
41         static void GroupJoinFunction()
42         {
43             List<Team> teams = new List<Team>{new Team{ TeamName="t1"}
44             ,new Team{TeamName="t2"}
45            ,new Team{TeamName="t3"}
46            };
47             List<Rider> riders = new List<Rider> { 
48             new Rider{Name="r1",TeamName="t1"},
49             new Rider{Name="r2",TeamName="t1"},
50             new Rider{Name="r3",TeamName="t2"},
51             new Rider{Name="r4",TeamName="t2"},
52             new Rider{Name="r5",TeamName="t3"},
53             new Rider{Name="r6",TeamName="t3"},
54             };
55             //方法語法
56             var query = teams.GroupJoin(riders, t => t.TeamName, r => r.TeamName,
57                 (t, r) => new { teamname = t.TeamName, ridernames = r.Select(o => o.Name) });
58             foreach (var item in query)
59             {
60                 Console.WriteLine(item.teamname);
61                 foreach (var item2 in item.ridernames)
62                 {
63                     Console.WriteLine("     "+item2);
64                 }
65             }
66         }
67         //output:
68         //t1
69         //    r1
70         //    r2
71         //t2
72         //    r3
73         //    r4
74         //t3
75         //    r5
76         //    r6
77         #endregion 
View Code

 

5.  分組操做符 (GroupBy)

 1 #region  分組操做符  根據一個特定的值(選擇器) 將序列中的值或元素進行分組
 2         /// <summary>
 3         ///
 4         /// </summary>
 5         static void GroupByFunction()
 6         {
 7             DataContext context = new DataContext(StaticData.ConnectSql);
 8             Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
 9             //按照每一個銷售人員對訂單進行分組
10             var query = orders.Where(o => o.SalesPersonID > 0).GroupBy(order => order.SalesPersonID, order => order.CustomerID);
11 
12             foreach (var item in query)
13             {
14                 Console.WriteLine(item.Key);
15                 foreach (var item2 in item)
16                 {
17                     Console.WriteLine("  " + item2);
18                 }
19             }
20         }
21         #endregion
View Code

 

6.  串聯操做符 (Concat)

 1  #region  串聯操做符
 2         /// <summary>
 3         /// 串聯操做符 Concat 【將兩個集合合併成一個集合】
 4         /// </summary>
 5         static void ConcatFunction( )
 6         {
 7             DataContext context = new DataContext(StaticData.ConnectSql);
 8             Table<Contact> contacts = context.GetTable<Contact>( );
 9             Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
10             //將Contact表的Firstname和SalesOrderHeader的CustomerID串聯起來
11             var query = contacts.Select(con => con.FirstName).Concat(orders.Select(order => order.CustomerID.ToString()));
12             foreach (var item in query)
13             {
14                 Console.WriteLine(item.ToString());
15             }
16           }
17         #endregion
View Code

 LINQ入門教程之各類標準查詢操做符(二)

 動動您的手指,點下支持,您的支持是我最大動力!

相關文章
相關標籤/搜索