## 前言
在工作上使用的 LINQ 的機會很多,針對語法的基本使用也不是問題,但對LINQ的了解就僅限於工作上有使用到的,所以決定來將LINQ做個理論上的整理。
## LINQ
全名 Language Integrated Query,以C#語言為基準,提供出一套資料查詢的方法,類型有 **LINQ to Object**、**LINQ to SQL**、**LINQ to XML**,還有在Entity Framework中提供的 **LINQ to Entities**,利用 LINQ 可以使用較少且清晰的程式碼邏輯,將資料做篩選、排序...等資料查詢邏輯。
### LINQ to Object
針對存放在記憶體中的資料提供的 LINQ 查詢方式,只要集合類別有實作 IEnumerable、IEnumerable<T> 或 IQueryable<T> 介面,就能以 LINQ to Object 進行查詢,例如:List、Dictionary。
* 程式碼範例
```csharp=
//建立資料
List<string> city = new List<string> {"Taipei","Japan","Seoul" };
//以查詢運算式撰寫 LINQ
var query = from c in city
where c == "Taipei"
select c;
//執行查詢
foreach (string output in query)
{
Console.WriteLine(output);
}
```
LINQ 查詢分為三個步驟,建立資料、撰寫查詢、執行查詢,所以在撰寫查詢運算式時,LINQ 還尚未被執行,而是需使用到查詢結果時,才會進行查詢。
### LINQ to XML
針對 XML 資料提供的 LINQ 方法,可進行查詢及修改。
* 範例 XML
```xml=
<School Name="DemoSchool" Level="Junior">
<Teacher Gender="Male">
<Student Name="Cindy">
<Grade Subject="Math">100</Grade>
<Grade Subject="Chinese">88</Grade>
</Student>
</Teacher>
<Teacher Gender="Female">
<Student Name="Johnson">
<Grade Subject="English">70</Grade>
<Grade Subject="Math">56</Grade>
<Grade Subject="Chinese">76</Grade>
</Student>
</Teacher>
</School>
```
* 程式碼:取出所有學生的姓名
```csharp=
string xmlPath = Path.Combine(Directory.GetCurrentDirectory(), "School.xml");
XElement xmlData = XElement.Load(xmlPath);
var query = from student in xmlData.Descendants("Teacher")
select student;
foreach (var item in query.Descendants("Student"))
{
Console.WriteLine((string)item.Attribute("Name"));
}
```
* LINQ to XML 詳細的使用,放上 MSDN 系列教學連結 [MSDB](https://learn.microsoft.com/zh-tw/dotnet/standard/linq/linq-xml-overview)
<!--
### LINQ to SQL
FSJSKLFJKLDASFJDKLJFSDKLJFLSKDJFSDLKFJSLKDFJLSDKF-->
### LINQ to Entities
在 Entity Framework 架構下,也可以使用 LINQ 對 Entity 中的資料進行查詢
* 程式碼
```csharp=
using (DemoEntities entities = new DemoEntities())
{
var query = from student in entities.Student
where student.Name == "Kevin"
select student.name
foreach (string name in query)
{
Console.WriteLine(name);
}
}
```
* LINQ to Entities MSDN 教學連結 [MSDN](https://learn.microsoft.com/zh-tw/dotnet/framework/data/adonet/ef/language-reference/linq-to-entities)
###### tags: `C#` `LINQ`