很久以前就想系統的學習下LINQ,很久以前……html
本篇文章主要介紹LINQ等的標準查詢操做符,內容取自《LINQ高級編程》,後續還會介紹LINQ to XML ,LINQ to SQL。編程
進入正題學習
(一)先介紹下標準查詢操做符的概念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
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
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
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
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
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
動動您的手指,點下支持,您的支持是我最大動力!