語言集成查詢(英語:Language Integrated Query,縮寫:LINQ),發音"link",是微軟的一項技術,新增一種自然查詢的SQL語法到.NET Framework的程式語言中,當前可支持C#以及Visual Basic .NET語言。2007年11月19日隨.NET Framework 3.5發布了LINQ技術。
包括LINQ to Objects、LINQ to SQL、LINQ to Datasets、LINQ to Entities、LINQ to Data Source、LINQ to XML/XSD等。
基本介紹
- 中文名:語言集成查詢
- 外文名:Language Integrated Query
- 開發公司:微軟
- 語言:C#,Visual Basic
基本含義
語言風格
匿名類型
[WebGet] public IQueryable<Categories>GetCategoryByName(string CategoryName) { try{ var query = base.CurrentDataSource.Categories.Where ("it.CategoryName = @Name", new ObjectParameter[] { new ObjectParameter("Name", CategoryName) }); } catch (Exception) { throw; } return query; }
[WebGet] public IQueryable<Categories> GetCategoryByName(string CategoryName) { IQueryable<Categories> CS$1$0000; // 由編譯器改寫而成。 try { CS$1$0000 = base.CurrentDataSource.Categories.Where ("it.CategoryName = @Name", new ObjectParameter[] { new ObjectParameter("Name", CategoryName) }); } catch (Exception) { throw; } return CS$1$0000; }
標準查詢運算符
操作符 | 類別 | 語義 | 示例 |
---|---|---|---|
Where | 篩選操作符(Restriction) | Where(Predicate) | Dim lowNums = numbers.Where(Function(num) num < 5) |
Select | 投影操作符(Projection) | Select(匿名函式) | Dim lowNums = numbers.Select(Function(num) num*num) |
SelectMany | 投影操作符(Projection) | 返回多行結果,用於多表的交叉連線(cross join) | Dim res = Employees.SelectMany(Function(e) e.Family.Select(Function(c)c.name)) |
Skip | 分塊操作符(Partitioning) | 跳過前n個元素 | Dim res=data.Skip(4) |
SkipWhile | 分塊操作符(Partitioning) | 跳過起始處使條件為真的所有元素 | Dim res=data.SkipWhile(Function(i) i%2 = 0) |
Take | 分塊操作符(Partitioning) | 返回開頭之處的n個元素 | Dim res=data.Take(3) |
TakeWhile | 分塊操作符(Partitioning) | 返回起始處使條件為真的所有元素 | Dim res=data.TakeWhile(Function(i) i%3 = 0) |
Join | 連線操作符 | 內連線兩個或多個表,僅限於Equals運算符 | from sup in suppliers join cust in customers on sup.Country equals cust.Country |
GroupJoin | 連線操作符 | 類似於LEFT OUTER JOIN,右側集合匹配於左側集合鍵值的元素被分組 | From cust In customers Group Join ord In orders On cust.CustomerID Equals ord.CustomerID Into CustomerOrders = Group, OrderTotal = Sum(ord.Total) |
Concate | 合併操作符 | 用於連線兩個序列 | returnValue = firstSeq.Concat(secondSeq) |
OrderBy | 排序操作符(Ordering) | Dim query As IEnumerable(Of Person) = Persons.OrderBy(Function(p) p.Age) | |
OrderByDescending | 排序操作符(Ordering) | ||
ThenBy | 排序操作符(Ordering) | ||
ThenByDescending | 排序操作符(Ordering) | ||
Reverse | 排序操作符(Ordering) | ||
GroupBy | 分組操作符 | Dim numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0} Dim numberGroups = From num In numbers Group num By remainder5 = (num Mod 5) Into numGroup = Group Select New With {.Remainder = remainder5, .numbers = numGroup} | |
Distinct | 集合操作符 | 去重複 | |
Union | 集合操作符 | 集合併 | |
Intersect | 集合操作符 | 集合交 | |
Except | 集合操作符 | 集合差 | |
AsEnumerable | 轉換操作符 | 用於把一個IEnumerable的派生類型轉化為IEnumerable類型 | |
AsQueryable | 轉換操作符 | IEnumerable(Of T)轉化為IQueryable(Of T). | |
ToArray | 轉換操作符 | 轉換為數組 | |
ToList | 轉換操作符 | 轉換為List | |
ToDictionary | 轉換操作符 | 轉換為一對一的字典(鍵-值對的集合) | |
ToLookup | 轉換操作符 | 轉換為一對多的字典(鍵-值集的集合) | |
OfType | 轉換操作符 | 獲取指定類型的元素組成一個數組 | object[] numbers = { null, 1.0, "two", 3, "four", 5, "six", 7.0 }; var doubles = numbers.OfType<double>(); |
Cast | 轉換操作符 | 把序列的所有元素轉換為指定類型 | |
SequenceEqual | 相等操作符 | 兩個序列的元素依次相同返回真。使用元素所屬類的IEqualityComparer(Of T) 泛型界面做相等比較 | |
First | 元素操作符 | 返回序列第一個元素(或滿足條件第一個元素),沒有則異常 | |
FirstOrDefault | 元素操作符 | 返回序列第一個元素,沒有則返回空或默認值 | |
Last | 元素操作符 | 返回序列最後一個元素,沒有則異常 | |
LastOrDefault | 元素操作符 | 返回序列最後一個元素,沒有則返回空或默認值 | |
Single | 元素操作符 | 返回序列唯一元素,如果沒有元素或多個元素則異常 | |
SingleOrDefault | 元素操作符 | 返回序列唯一元素,如果沒有元素或多個元素則空或默認值 | |
ElementAt | 元素操作符 | 返回序列指定元素,失敗則異常 | |
ElementAtOrDefault | 元素操作符 | 返回序列指定元素,失敗則空或默認值 | |
DefaultIfEmpty | 元素操作符 | 返回序列,如果序列為空則返回元素的默認值 | For Each number As Integer In numbers.DefaultIfEmpty()〈br> output.AppendLine(number) Next |
All | 序列元素數量操作符 | 序列所有元素滿足條件則為真 | |
Any | 序列元素數量操作符 | 序列有一個元素滿足條件則為真 | |
Contains | 序列元素數量操作符 | 是否包含一個元素 | |
Count | 統計操作符 | 計數,可選一個謂詞 | int oddNumbers = numbers.Count(n => n% 2 == 1); |
LongCount | 統計操作符 | 計數,返回Int64類型 | |
Sum | 統計操作符 | 求和,可選對一個lambda函式表達式 | double totalChars = words.Sum(w => w.Length); |
Min | 統計操作符 | 最小值,可選對一個lambda函式表達式 | int shortestWord = words.Min(w => w.Length); |
Max | 統計操作符 | ||
Average | 統計操作符 | ||
Aggregate | 統計操作符 | 參數為一個委託,在序列的每個元素上執行該委託。委託的第一個參數為當前累計值,第二個參數為當前元素,返回值為新的累計值 | Dim reversed As String = words.Aggregate(Function(ByVal current, ByVal word) word & " " & current) |
equals/Equals | 關鍵字 | 用於Join子句 | |
from/From | 關鍵字 | ||
in/In | 關鍵字 | 指出數據源 | |
into/Into | 關鍵字 | 用於Group By子句 | |
key | 關鍵字 | 用於Group By子句的無名類型 | |
let | 關鍵字 | 給表達式定義別名 | From prod In products Let Discount = prod.UnitPrice * 0.1 Where Discount >= 50 Select prod.ProductName, prod.UnitPrice, Discount |
Group | 關鍵字 | 在GroupBy子句的Into中用於辨識分組結果 | From num In numbers Group num By remainder5 = (num Mod 5) Into Group |
Range | 方法 | 產生一個整數序列 | From n In Enumerable.Range(100, 50) |
Repeat | 方法 | 產生一個整數序列 | From n In Enumerable.Repeat(7, 10) |
LINQ的各式言語支持度
LINQ的示例
using System;using System.Linq;namespace DuckTyping{ internal class Program { private static void Main() { int[] array = { 1, 5, 2, 10, 7 }; // Select squares of all odd numbers in the array sorted in descending order var results = from x in array where x % 2 == 1 orderby x descending select x * x; foreach (var result in results) { Console.WriteLine(result); } } }}
// the Northwind type is a subclass of DataContext created by SQLMetal// Northwind.Orders is of type Table<Order>// Northwind.Customers is of type Table<Customer>Northwind db = new Northwind(connectionString); // use 'var' keyword because there is no name for the resultant type of the projection var q = from o in db.Orders from c in db.Customers where o.Quality == "200" && (o.CustomerID == c.CustomerID) select new { o.DueDate, c.CompanyName, c.ItemID, c.ItemName }; // q is now an IEnumerable<T>, where T is the anonymous type generated by the compilerforeach (var t in q){ // t is strongly typed, even if we can't name the type at design time Console.WriteLine("DueDate Type = {0}", t.DueDate.GetType()); Console.WriteLine("CompanyName (lowercased) = {0}", t.CompanyName.ToLower()); Console.WriteLine("ItemID * 2 = {0}", t.ItemID * 2);}