Language-Integrated Query (LINQ) 是一組技術的名稱,這組技術所憑藉的基礎是將查詢功能
直接整合至 C# 語言 (以及 Visual Basic,也可能是其他任何 .NET 語言) 中。 透過 LINQ,
查詢現在已成為第一級的語言建構,就如同類別、方法、事件等等。
對於撰寫查詢的開發人員而言,LINQ 最明顯的「語言整合」部分就是它的查詢運算式。 查詢
運算式是以 C# 3.0 所引入的宣告式「查詢語法」(Query Syntax) 來撰寫。
透過使用查詢語法,您可以使用最少的程式碼,在資料來源上執行更為複雜的篩選、排序和群
組等作業。 您可以使用相同的基本查詢運算式模式,在 SQL 資料庫、ADO.NET 資料集、XML
文件和資料流以及 .NET 集合中查詢及轉換資料。
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
=======================================================================================
「查詢」(Query) 是一種從資料來源擷取資料的運算式, 而且使用專用的查詢語言來表示。
一段時間之後,針對不同類型的資料來源已開發出不同的語言,例如 SQL 是用於關聯式資料庫,
而 XQuery 則是 XML。 因此,開發人員必須針對他們所需支援的資料來源類型或資料格式學習新
的查詢語言。
LINQ 提供一致的模型來使用各種資料來源和格式的資料,從而簡化此情況。
在 LINQ 查詢中,您所處理的一定是物件。
不論您要查詢及轉換的資料是存在 XML 文件、SQL 資料庫、ADO.NET 資料集,還是 .NET 集合,
以及其他任何有可用 LINQ 提供者 (Provider) 的格式中,都是使用相同的基本程式碼撰寫模式。
查詢作業的三個部分
-----------------------------------------
所有的 LINQ 查詢作業都包含三個不同的動作:
1.取得資料來源。
2.建立查詢。
3.執行查詢。
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
=======================================================================================
資料來源 :
XElement contacts = XElement.Load(@"c:\myContactList.xml");
DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");
查詢執行 :
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
int evenNumCount = evenNumQuery.Count();
=======================================================================================
LINQ 查詢是以 .NET Framework 2.0 版中就引進的泛型型別為基礎。
您不需要對泛型型別有相當程度的了解,就可以開始撰寫查詢。不過,您可能需要了解兩個基本概念:
1.建立泛型集合類別 (Class) (如 List<T>) 的執行個體 (Instance) 時,請將 "T" 取代為清單中會包含之物件的型別。
例如,字串的清單是以 List<string> 表示,而 Customer 物件的清單則是以 List<Customer> 表示。 泛型清單是強型別的,
而且優點多於以 Object 形式儲存項目的集合。
如果您嘗試將 Customer 加入至 List<string>,就會在編譯時期接收到錯誤。 泛型集合不需要執行執行階段的
型別轉換 (Type Cast),因此十分容易使用。
2.IEnumerable<T> 這個介面可讓您使用 foreach 陳述式來列舉泛型集合類別。 就像 ArrayList 等非泛型集合類別
支援 IEnumerable,泛型集合類別同樣可以支援 IEnumerable<T>。
讓編譯器處理泛型型別宣告
--------------------------------------------------------------------------------
想要的話,您可以使用 var 關鍵字來避免使用泛型語法。 var 關鍵字會指示編譯器 (Compiler)
查看 from 子句中指定的資料來源,來推斷查詢變數的型別。
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
--------------------------------------------------------------------------------
group ... by ... / orderby ... 範例
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;
--------------------------------------------------------------------------------
Queryable.FirstOrDefault<TSource> 方法
傳回序列的第一個項目;如果序列中沒有包含任何項目,則傳回預設值。