語言整合查詢

語言整合查詢，發音"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等。語言風格.LINQ依賴於語言的多項新增風格，來展示出查詢語言的擴充性。例如：C#:匿名型別.匿名型別是C# 3.0與Visual Basic 9.0新增的功能，它允許開發人員可以使用不具型別的方式建立新的資料結構，而真正的型別在編譯時期，由C# (或VB) Compiler自動產生，並寫入編譯目的檔中，它可以讓開發人員能夠很簡單利用匿名型別建立物件，LINQ中的select指令即是利用這種特性來建立回傳物件。匿名型別本質上是表達元組，採用值語義。下列使用匿名型別的程式碼：[WebGet]public IQueryable GetCategoryByName(string CategoryName)tryvar query = base.CurrentDataSource.Categories.Where("it.CategoryName = @Name", new ObjectParameter[] { new ObjectParameter("Name", CategoryName) });catch (Exception)throw;return query;會由編譯器改寫為：[WebGet]public IQueryable GetCategoryByName(string CategoryName)IQueryable CS$1$0000;　// 由編譯器改寫而成。tryCS$1$0000 = base.CurrentDataSource.Categories.Where("it.CategoryName = @Name", new ObjectParameter[] { new ObjectParameter("Name", CategoryName) });catch (Exception)throw;return CS$1$0000;查詢表示式語法.from RangeVariable in IEnumerable的Collection流利語法.LINQ查詢時有兩種語法可供選擇：查詢表示式語法。前者使用查詢運算子；後者利用System.Linq.Enumerable類中定義的擴充套件方法和Lambda表示式方式進行查詢。CLR本身並不理解查詢表示式語法，它只理解流利語法。編譯器負責把查詢表示式語法編譯為流利語法。以下是一個示例LINQ方法語法的查詢，返回陣列中的偶數：int[] ints={1,2,3,4};var result = ints.Where(p =&gt; p % 2 == 0).ToArray();對比流利語法和C#的傳統語法：// extension methods make LINQ elegantIEnumerable query = names.Where(n =&gt; n.Contains("a")).OrderBy(n =&gt; n.Length).Select(n =&gt; n.ToUpper());// static methods lose query's fluencyIEnumerable query2 =Enumerable.Select(Enumerable.OrderBy(Enumerable.Where(names, n =&gt; n.Contains("a")), n =&gt; n.Length), n =&gt; n.ToUpper()標準查詢運運算元 (Standard query operators).System.Linq.Enumerable靜態類聲明瞭一套標準查詢運算子方法集合。基本語法如下：using (var db = new EntityContext())var roles = from o in db.Userswhere o.Account == "Apollo"select o.Roles;標準查詢運算子和Lambda表示式的關係非常密切。編譯器會將上述表示式轉化為下述以Lambda表示式為引數的顯式擴充套件方法呼叫序列：using (var db = new EntityContext())var roles = db.Users.Where(o =&gt; o.Account == "Apollo").Select(o =&gt; o.Roles);LINQ的各式言語支援度.下列的言語支援LINQ。註：C++/CLI尚未支援LINQ。但是有第三方的C++套件，以及第三方的PHP套件LINQ的範例.一個簡單例子：using System;using System.Linq;namespace DuckTypinginternal class Programprivate static void Main()int[] array = { 1, 5, 2, 10, 7 };// Select squares of all odd numbers in the array sorted in descending ordervar results = from x in arraywhere x % 2 == 1orderby x descendingselect x * x;foreach (var result in results)Console.WriteLine(result);輸出：49251另一個例子：// the Northwind type is a subclass of DataContext created by SQLMetal// Northwind.Orders is of type Table// Northwind.Customers is of type TableNorthwind db = new Northwind(connectionString);// use 'var' keyword because there is no name for the resultant type of the projectionvar q = from o in db.Ordersfrom c in db.Customerswhere o.Quality == "200" &amp;&amp; (o.CustomerID == c.CustomerID)select new { o.DueDate, c.CompanyName, c.ItemID, c.ItemName };// q is now an IEnumerable, 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 timeConsole.WriteLine("DueDate Type = {0}", t.DueDate.GetType());Console.WriteLine("CompanyName (lowercased) = {0}", t.CompanyName.ToLower());Console.WriteLine("ItemID * 2 = {0}", t.ItemID * 2);Visual Studio支援.LINQ目前由Visual Studio 2008、2010、2012、2013、2015、2017、2019支援。語言擴充套件.微軟同樣提供了LINQExtender，允許使用者在不瞭解LINQ實現細節的情況下，編寫自己的LINQ擴充套件。如：LINQ to Twitter,LINQ to Oracle,LINQ to Active Directory等