LINQ
LINQ關鍵字
from 指定數據源和范圍變量
where 根據布爾表達式(由邏輯與 或 等組成)從數據源中篩選元素
select 指定查詢結果中的元素所具有的類型或表現形式
group 對對查詢結果按照鍵值進行分組
into 提供一個標示符,它可以充當對 join group 或 select 子句結果的引用
orderby 對查詢出的元素進行排序
join 按照兩個指定匹配條件來聯接倆個數據源
let 產生一個用於查詢表達式中子表達式查詢結果的范圍變量
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication7LINQ { class Customer { public string ID { get; set; } public string City { get; set; } public string Country { get; set; } public string Region { get; set; } public decimal Sales { get; set; } public override string ToString()//重寫ToString(),默認的ToString()僅輸出類型名稱 { return "ID:" + ID + "City:" + City + "Country:" + Country + "Region:" + Region + "Sales:" + Sales; } } class Order { public string ID { get; set; } public decimal Amount { get; set; } } class Program { /// <summary> /// 生成隨機數組 /// </summary> /// <param name="count"></param> /// <returns></returns> private static int[] GenerateLotsofNumbers(int count) { Random generator = new Random(1); //使用指定的種子值初始化 Random 類的新實例。 int[] result = new int[count]; for (int i = 0; i < count; i++) { result[i] = generator.Next(); } return result; } //1.用var關鍵字聲明結果變量 //2.指定數據源:from 子句 //3.指定條件:where 子句 //4.指定元素:select子句 //5.完成:使用foreach循環 static void Main(string[] args) { // string[] names = { "Alono", "Zheng", "Yuan", "Song", "Simle", "Hsieh", "Small", "She", "Sza", "Sam", "Fa", "Iyl" }; // //var queryResults = from n in names // // where n.StartsWith("S") // // orderby n descending//按照最后一個字母排序 ordeby n.Substring(n.Length - 1) // // select n;//查詢語法 // var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith("S"));//方法語法 Lambda 表達式 //// var queryResults = names.OrderByDescending(n => n).Where(n => n.StartsWith("S")); // foreach (var item in queryResults) // Console.WriteLine(item); // Console.ReadKey(); //-------------------------------------------------------------------------------------------------- //int[] numbers = GenerateLotsofNumbers(12345678); //var queryResults = from n in numbers // where n < 1000 // select n; //foreach (var item in queryResults) //{ // Console.WriteLine(item); //} //Console.WriteLine("聚合運算符......"); //Console.WriteLine(queryResults.Count()); //Console.WriteLine(queryResults .Max ()); //Console.WriteLine(queryResults.Average()); //Console.WriteLine(queryResults.Sum()); //Console.ReadKey(); //-------------------------------------------------------------------------------------------------- List<Customer> customers = new List<Customer> { new Customer {ID ="A",City ="New York",Country ="USA",Region ="North America",Sales =9999}, new Customer {ID ="B",City ="New York",Country ="USA",Region ="North America",Sales =9999}, new Customer {ID ="C",City ="XiAn",Country ="China",Region ="Asia",Sales =7777}, new Customer {ID ="D",City ="New York",Country ="USA",Region ="North America",Sales =9999}, new Customer {ID ="E",City ="BeiJing",Country ="China",Region ="Asia",Sales =8888}, new Customer {ID ="F",City ="New York",Country ="USA",Region ="North America",Sales =9999} }; //var queryReaults = // from n in customers // where n.Region == "Asia" // select n; //foreach (var item in queryReaults ) // Console.WriteLine(item); //Console.ReadKey(); //--------------------------------------投影---------------------------------------------- //投影是在LINQ查詢中從其他數據類型中創建新數據類型的術語。 //var queryResults = // from c in customers // where c.Region == "Asia" // select new { c.City, c.Country, c.Sales }; //var queryResults = customers.Where(c => c.Region == "Asia").Select(c => new { c.City, c.Country, c.Sales }); //var queryResults = customers.Select(c => new { c.City, c.Country, c.Sales }).Where(c => c.City == "XiAn"); //foreach (var item in queryResults) // Console.WriteLine(item); //Console.ReadKey(); //--------------------單值選擇查詢------------------------ var queryResults1 = customers.Select(c => c.Region).Distinct(); var queryResults2 = (from c in customers select c.Region).Distinct(); //------------------------Any和All--------------------------------- bool anyUSA = customers.Any(c => c.Country == "USA"); if(anyUSA ) Console.WriteLine("some customers are in USA"); else Console.WriteLine("WAWA"); bool allAsia = customers.All(c => c.Region == "Asia"); if(allAsia ) Console.WriteLine("WAWA"); else Console.WriteLine("All customers are in Asia"); // Console.ReadKey(); //--------------------------------多級排序--------------------------------------- var queryReaults3 = from n in customers where n.Region == "Asia" orderby n.Region ,n.Country descending ,n.City //查詢語法 多級排序 select n; var queryResults4 = customers.OrderBy(c => c.Region).ThenByDescending(c => c.Country).ThenBy(c => c.City).Select(c => new { c.ID, c.Region, c.Country, c.City }); //方法語法 多級排序 //------------------------------------組合查詢(group query)------------------------------------- //組合查詢中的數據通過一個鍵(Key)字段來組合,每一個組中的所有成員都共享這個字段值,在這個例子中 鍵字段是Region //要計算每個組的總和,應先生成一個新的結果集cg var queryResults5 = from c in customers group c by c.Region into cg select new { TotalSales = cg.Sum(c => c.Sales), Region = cg.Key }; var orderedResults = from cg in queryResults5 orderby cg.TotalSales descending select cg; foreach (var item in orderedResults) Console.WriteLine(item.TotalSales + "\t:" + item.Region); //Console.ReadKey(); //------------------------Take 和 Skip---------------------------------- //Take() 從查詢結果中提取前n個結果 //Skip() 從查詢結果中跳過前n個結果 返回剩余的結果 foreach (var item in orderedResults .Take (2)) Console.WriteLine(item.TotalSales + "\t:" + item.Region); //---------------------------First 和 FirstOrDefault------------------------------- //First() 返回結果集中第一個匹配給定條件的元素 //FirstOrDefault() 當查詢條件不滿足是,將為列表返回默認元素 而使用First()則返回null Console.WriteLine(queryReaults3.FirstOrDefault(n => n.Region == "Asia")); //--------------------------------集運算符----------------------------- List<Order> orders = new List<Order>{ new Order {ID="A",Amount=100}, new Order {ID ="B",Amount =200}, new Order {ID ="H",Amount =300}}; var customersIDs = from c in customers select c.ID; var ordersIDs = from o in orders select o.ID; var customersWithOrders = customersIDs.Intersect(ordersIDs);//Intersect() foreach (var item in customersWithOrders ) Console.WriteLine(item ); Console.WriteLine("-------------------------"); var ordersNoCustomers = ordersIDs.Except(customersIDs);//Except() foreach (var item in ordersNoCustomers ) Console.WriteLine(item ); Console.WriteLine("-------------------------"); var allCustomersOrders = ordersIDs.Union(customersIDs);//Union() foreach (var item in allCustomersOrders) Console.WriteLine(item); //Console.ReadKey(); //---------------------------------Join---------------------------- //使用Join運算符在一個查詢中查找多個集合中的相關數據,用鍵字段把結果連接起來 var queryResults9 = from c in customers join o in orders on c.ID equals o.ID select new { c.ID, c.City, SalesBefore = c.Sales, NewOrder = o.Amount, SalesAfter = c.Sales + o.Amount }; foreach (var item in queryResults9 ) Console.WriteLine(item ); Console.ReadKey(); } } }
into子句
into子句作為一個臨時標識符,用於group select join 子句中。它存儲了into子句前面的查詢內容,是后面的子句可以方便的使用,對其進行再次查詢或排序 投影等操作。

/// <summary> /// 客戶信息 /// </summary> public class GuestInfo { /// <summary> /// 姓名 /// </summary> public string Name { set; get; } /// <summary> /// 年齡 /// </summary> public int Age { set; get; } /// <summary> /// 電話 /// </summary> public string Tel { set; get; } /// <summary> /// 電話表 /// </summary> public List<string> TelTable { set; get; } }

namespace DemoInto { class Program { static void Main(string[] args) { //初始化集合 List<GuestInfo> gList = new List<GuestInfo>() { new GuestInfo { Name = "蕭玉霜", Age = 17, Tel = "053*-985690**" }, new GuestInfo { Name = "蕭玉若", Age = 21, Tel = "035*-120967**" }, new GuestInfo { Name = "徐長今", Age = 18, Tel = "039*-967512**" }, new GuestInfo { Name = "徐芷晴", Age = 24, Tel = "089*-569832**" } }; //按照名字的第一個字進行分組並用分組key進行排序 Console.WriteLine("into用於group子句的分組時刻"); var query = from guest in gList group guest by guest.Name.Substring(0, 1) into grguest orderby grguest.Key descending select grguest; //遍歷分組數據 foreach (var guestGroup in query) { //輸出當前分組的鍵值 Console.WriteLine(string.Format("分組鍵:{0} \n", guestGroup.Key)); //遍歷組內元素 foreach (var g in guestGroup) Console.WriteLine(string.Format("{0} 電話:{1}", g.Name, g.Tel)); Console.WriteLine("\n**********************************\n"); } Console.WriteLine("\ninto用於select子句的投影時刻"); //select 子句中 的 info 子句使用 var query2 = from guest in gList select new{NewName = guest.Name, NewAge = guest.Age} into newguest orderby newguest.NewAge select newguest; //遍歷分組數據 foreach (var g in query2) { Console.WriteLine(string.Format("{0} 年齡:{1}", g.NewName,g.NewAge)); } Console.ReadKey(); } } }
let子句
let語句在LINQ表達式中存儲子表達式的計算結果。let子句創建一個范圍變量來存儲結果,變量被創建后,不能修改或把其他表達式的結果重新賦值給它。此范圍變量可以在后續的LINQ語句中使用。

namespace DemoLet { class Program { static void Main(string[] args) { //初始化集合 List<GuestInfo> gList = new List<GuestInfo>() { new GuestInfo { Name = "林晚榮", Age = 21, Tel = "026*-888888**" }, new GuestInfo { Name = "肖青漩", Age = 21, Tel = "017*-876543**" }, new GuestInfo { Name = "董巧巧", Age = 19, Tel = "029*-981256**" }, }; ///姓"肖"或姓 "董"的客戶 var query = from guest in gList let g = guest.Name.Substring(0,1) where g == "肖" || g == "董" select guest; foreach (var g in query) Console.WriteLine(string.Format("{0} 年齡:{1} 電話:{2}", g.Name, g.Age, g.Tel)); Console.ReadKey(); } } }
join子句
如果一個數據源中元素的某一個屬性可以跟另外一個數據源中元素的屬性進行相等比較,那么着兩個數據源可以用join子句進行關聯
join子句使用equals關鍵字進行相等比較

/// <summary> /// 客戶職務 /// </summary> public class GuestTitle { /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 職務 /// </summary> public string Tilte { get; set; } }

class Program { static void Main(string[] args) { //初始化客戶集合 List<GuestInfo> gList = new List<GuestInfo>() { new GuestInfo { Name = "林晚榮", Age = 21, Tel = "026*-888888**" }, new GuestInfo { Name = "肖青漩", Age = 21, Tel = "017*-876543**" }, new GuestInfo { Name = "董巧巧", Age = 19, Tel = "029*-981256**" }, new GuestInfo { Name = "徐芷晴", Age = 24, Tel = "089*-569832**" } }; ///初始化客戶職務集合 List<GuestTitle> titleList = new List<GuestTitle>() { new GuestTitle{ Name = "林晚榮", Tilte = "金刀漢王"}, new GuestTitle{ Name = "林晚榮", Tilte = "天下第一丁"}, new GuestTitle{ Name = "肖青漩", Tilte = "出雲公主"}, new GuestTitle{ Name = "董巧巧", Tilte = "酒店CEO"}, new GuestTitle{ Name = "董巧巧", Tilte = "乖巧人兒"} }; Console.WriteLine("內部聯接"); //根據姓名進行內部聯接 var query = from guest in gList join title in titleList on guest.Name equals title.Name select new { Name = guest.Name, Title = title.Tilte, Age = guest.Age }; foreach (var g in query) Console.WriteLine(string.Format("{0} {1} 年齡:{2}", g.Title, g.Name, g.Age)); Console.WriteLine("\n根據姓名進行分組聯接"); //根據姓名進行分組聯接 var query2 = from guest in gList join title in titleList on guest.Name equals title.Name into tgroup select new { Name = guest.Name, Titles = tgroup }; foreach (var g in query2) { Console.WriteLine(g.Name); foreach (var g2 in g.Titles) Console.WriteLine(string.Format(" {0}", g2.Tilte)); } Console.WriteLine("\n左外部聯接"); //根據姓名進行左外部聯接 var query3 = from guest in gList join title in titleList on guest.Name equals title.Name into tgroup from subtitle in tgroup.DefaultIfEmpty() select new { Name = guest.Name, Title = (subtitle == null ? "空缺" : subtitle.Tilte)} ; foreach (var g in query3) Console.WriteLine(string.Format("{0} {1}", g.Title, g.Name)); Console.ReadKey(); } }
注:以上代碼來自《C#入門經典5》《LINQ入門及應用》!!!