記錄LINQ學習過程。 概要 LINQ是一種“語言集成”的查詢表達式,使用LINQ可以智能提示和進行類型檢查。C#里可以編寫的LINQ查詢有SQL資料庫、XML文檔、ADO.NET數據集、支持IEnumerable和IEnumerable的對象。使用LINQ,可以簡單對數據源進行分組、排序、篩選。有 ...
記錄LINQ學習過程。
概要
LINQ是一種“語言集成”的查詢表達式,使用LINQ可以智能提示和進行類型檢查。C#里可以編寫的LINQ查詢有SQL資料庫、XML文檔、ADO.NET數據集、支持IEnumerable和IEnumerable的對象。使用LINQ,可以簡單對數據源進行分組、排序、篩選。有一些第三方庫也為Web服務和其他資料庫提供了LINQ支持。
數組隱式支持了 IEnumerable 介面的。
//尚未執行查詢,等待遍歷再查。 可以在查詢表達式後面添加ToList或ToArray方法,使之立刻查詢。 IEnumerable<int> scoreQuery = from score in new int[] { 97, 92, 81, 60 } where score > 90 select score;
在編譯時,查詢表達式根據 “C# 規範規則”轉換成“標準查詢運算符方法調用”。
在編寫 LINQ 查詢時最好使用查詢語法,必要時可以使用方法調用。
查詢簡介
要想查詢,數據源必須在記憶體中。
//LINQ to XML 將 XML 文檔載入到可查詢的 XElement 類型中: XElement contacts = XElement.Load(@"c:\myContactList.xml"); //LINQ to SQL ,可以手動設計對象關係映射或藉助LINQ TO SQL工具
LINQ和泛型
LINQ引入泛型機制。泛型屬於強類型,不必執行運行時類型轉換,與Object相比,優勢更多。
編譯器可以處理泛型類型聲明,因此可以通過var關鍵字避免使用泛型語法。在LINQ里,是否顯示指定類型並不重要時,例如LINQ分組查詢之後的指定嵌套泛型類型,建議使用var。畢竟晦澀難懂的代碼不太招人喜歡喔!
LINQ基本查詢
篩選,排序
namespace ConsoleApp4 { class Program { static void Main(string[] args) { IEnumerable<Customer> customers = new List<Customer>() { new Customer(){Name="David M. Buss" , City="美國奧斯汀"}, new Customer(){Name="David M. Buss 1" , City="美國奧斯汀"}, new Customer(){Name="David M. Buss 2" , City="美國奧斯汀"}, new Customer(){Name="阿爾弗雷德·阿德勒" , City="英國阿伯丁"},}; var queryUSCustomers = from customer in customers where customer.City == "美國奧斯汀" orderby customer.Name ascending select customer; foreach(var customer in queryUSCustomers) { Console.WriteLine(customer.Name); } } } class Customer { public string Name { get; set; } public string City { get; set; } } } David M. Buss David M. Buss 1 David M. Buss 2
分組
namespace ConsoleApp4 { class Program { static void Main(string[] args) { IEnumerable<Customer> customers = new List<Customer>() { new Customer(){Name="David M. Buss" , City="美國奧斯汀"}, new Customer(){Name="David M. Buss 1" , City="美國奧斯汀"}, new Customer(){Name="David M. Buss 2" , City="美國奧斯汀"}, new Customer(){Name="阿爾弗雷德·阿德勒" , City="英國阿伯丁"},}; // queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>> var queryCustomersByCity = from cust in customers group cust by cust.City; //key 就是City // customerGroup is an IGrouping<string, Customer> //分組類型實現了IEnumerable介面 foreach (var customerGroup in queryCustomersByCity) { Console.WriteLine(customerGroup.Key); foreach (Customer customer in customerGroup) { Console.WriteLine($" {customer.Name}"); } } } } class Customer { public string Name { get; set; } public string City { get; set; } } }
關聯
namespace ConsoleApp4 { class Program { static void Main(string[] args) { IEnumerable<Customer> customers = new List<Customer>() { new Customer(){Name="David M. Buss" , City="美國奧斯汀"}, new Customer(){Name="David M. Buss 1" , City="美國奧斯汀"}, new Customer(){Name="阿爾弗雷德·阿德勒" , City="英國阿伯丁"},}; IEnumerable<City> cities = new List<City>() { new City(){Country="美國",CityName="美國奧斯汀"}, new City(){Country="英國",CityName="英國阿伯丁"}, }; var innerJoinQuery = from cust in customers join city in cities on cust.City equals city.CityName select new { Country = city.Country, Customer = cust.Name }; //匿名類型 foreach (var item in innerJoinQuery) { Console.WriteLine($"{item.Country},{item.Customer}"); } } } class Customer { public string Name { get; set; } public string City { get; set; } } class City { public string Country { get; set; } public string CityName { get; set; } } }
使用LINQ進行數據轉換
可以對原序列修改,可以在返回值創建新類型。
//Concat合併序列 var peopleInSeattle = (from student in students where student.City == "Seattle" select student.Last) .Concat(from teacher in teachers where teacher.City == "Seattle" select teacher.Last); //記憶體中數據結構轉換為xml var studentsToXML = new XElement("Root", from student in students let scores = string.Join(",", student.Scores) //存儲子表達式的結果 select new XElement("student", new XElement("First", student.First), new XElement("Last", student.Last), new XElement("Scores", GetScore(scores)) //調用C#方法 ) // end "student" ); // end "Root"