iT邦幫忙

0

DAY7-LINQ

  • 分享至 

  • xImage
  •  

LINQ 的類型與語法:深入探討
LINQ (Language Integrated Query) 提供了強大的資料查詢能力,將查詢功能整合到 C# 語言中。LINQ 的類型主要分為以下幾種,每種類型針對不同的資料來源提供特定的查詢方式:

LINQ 的類型
LINQ to Objects:

資料來源: 任何實作 IEnumerable 介面的集合,如 List、Array、Dictionary 等。
查詢方式: 直接對記憶體中的集合進行查詢。
範例:
C#
List numbers = new List { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(num => num % 2 == 0);
請謹慎使用程式碼。

LINQ to SQL:

資料來源: SQL Server 資料庫。
查詢方式: 將 LINQ 查詢轉換成 SQL 語句,再發送給資料庫執行。
範例:
C#
using (var db = new DataContext())
{
var customers = from c in db.Customers
where c.City == "New York"
select c;
}
請謹慎使用程式碼。

LINQ to Entities:

資料來源: Entity Framework 所建立的物件模型。
查詢方式: 類似 LINQ to SQL,但提供了更強大的物件關係映射功能。
範例:
C#
using (var context = new MyDbContext())
{
var products = from p in context.Products
where p.Price > 100
select p;
}
請謹慎使用程式碼。

LINQ to Entities
資料來源: Entity Framework 所建立的物件模型。這個模型代表了資料庫中的表格、關係和實體。
查詢方式: 透過 LINQ 語法直接對這些物件進行查詢,就像操作記憶體中的集合一樣。查詢結果會以物件的形式返回,可以方便地進行後續處理。
原理: LINQ to Entities 會將 LINQ 查詢轉換成 SQL 語句,然後傳送給資料庫執行。Entity Framework 會自動處理物件與資料庫之間的映射,開發人員不需要手寫 SQL。
範例解釋:
using (var context = new MyDbContext()): 創建一個資料庫上下文,用於與資料庫進行互動。
var products = from p in context.Products: 從 Products 這個實體集合中取出每個產品物件,並將其賦值給 p 變數。
where p.Price > 100: 篩選出價格大於 100 的產品。
select p: 選擇符合條件的產品物件。

LINQ to XML:

資料來源: XML 文件。
查詢方式: 使用 LINQ to XML 提供的元素和屬性來查詢 XML 資料。
範例:
C#
XElement customers = XElement.Load("customers.xml");
var newYorkCustomers = from c in customers.Elements("customer")
where (string)c.Element("city") == "New York"
select c;
請謹慎使用程式碼。

LINQ to XML
資料來源: XML 文件。XML 是一種用於存儲數據的標記語言。
查詢方式: 使用 LINQ to XML 提供的 XElement 和 XAttribute 等類別來表示 XML 元素和屬性,並使用 LINQ 語法對 XML 文檔進行查詢。
原理: LINQ to XML 將 XML 文檔載入到記憶體中,並建立一個 in-memory 的 XML 樹。然後,你可以使用 LINQ 的查詢語法來遍歷和篩選這個 XML 樹。
範例解釋:
XElement customers = XElement.Load("customers.xml"): 將 customers.xml 文件載入到記憶體中,並將根元素賦值給 customers 變數。
var newYorkCustomers = from c in customers.Elements("customer"): 從 customers 元素中取出所有 customer 子元素,並將其賦值給 c 變數。
where (string)c.Element("city") == "New York": 篩選出城市為 "New York" 的客戶。
select c: 選擇符合條件的客戶元素。

LINQ 的語法
LINQ 提供兩種主要的語法:

主要有兩種查詢寫法:

查詢運算式 (Query Expression Syntax)
標準查詢運算子 (Standard Query Operators)
3.1 查詢運算式(Query Expression Syntax)
查詢運算式是一種長得有點像SQL搜尋語法的運算式,範例如下:

from word in words
select word.key;
3.2 標準查詢運算子(Standard Query Operators)
標準查詢運算子,是應用於集合類型的運算子,提供了包括篩選、彙總、排序…等查詢功能,像是Select、Where、JOIN、OrderBy…等方法,範例如下:

words
.Select(word => word.key)

其實這兩種寫法,在經過Compiler編譯後,編譯出來的結果都是相同的! 所以可以依個人偏好選擇寫法。

下面舉個例子來說明一些細節:

var teenStudents = from s in studentList
where s.Age > 12 && s.Age < 20
select new { StudentName = s.StudentName, Age = s.Age };

foreach (var student in teenStudents)
{
Console.WriteLine(student);
}
從 studentList 的集合中,找到其中學生的年齡是介於12歲以及20歲之間的資料,並將學生的姓名以及年齡取出,之後進行輸出。


逐行解說

studentList.Where(s => s.Age > 12 && s.Age < 20):

Where 是一個標準查詢運算子,用於過濾符合條件的元素。
這裡的 lambda 表達式 s => s.Age > 12 && s.Age < 20 定義了過濾條件,也就是篩選出年齡介於 13 至 19 歲的學生。
.Select(s => new { StudentName = s.StudentName, Age = s.Age }):

Select 是一個標準查詢運算子,用於投影集合中的元素,也就是將每個元素轉換成新的物件。
這裡的 lambda 表達式 s => new { StudentName = s.StudentName, Age = s.Age } 定義了投影方式,將每個學生物件轉換成一個新的匿名物件,只包含 StudentName 和 Age 兩個屬性。


而上面的查詢運算式程式碼,編譯後結果等同於下面這段標準查詢運算子程式碼:

var teenStudents = studentList
.Where(s => (s.Age > 12 && s.Age < 20))
// Lambda表達式 (Lambda expression)
.Select(x => new {x.StudentName, x.Age});

//Lambda Statement
teenStudents.ToList().ForEach(
s => Console.WriteLine(s));})


在提供的程式碼中,Lambda 表達式主要用於:

篩選條件 (Where 子句):
s => (s.Age > 12 && s.Age < 20):這部分定義了一個匿名函數,用來判斷每個學生物件 s 是否符合年齡在 13 到 19 歲之間的條件。
投影 (Select 子句):
x => new {x.StudentName, x.Age}:這部分定義了一個匿名函數,用來將每個符合條件的學生物件投影成一個新的匿名物件,只包含 StudentName 和 Age 兩個屬性。
Lambda 表達式提供了一種簡潔的方式來定義匿名函數,使得 LINQ 查詢更具可讀性。

Lambda 陳述式 (Lambda Statement)
Lambda 陳述式則用於:

遍歷集合並執行操作 (ForEach 方法):
teenStudents.ToList().ForEach(s => Console.WriteLine(s));:這部分將 teenStudents 集合轉換成 List,然後對每個元素 s 執行 Console.WriteLine(s) 操作,也就是將每個匿名物件的資訊輸出到控制台。
Lambda 陳述式通常用於對集合中的每個元素進行一些操作,例如輸出、修改或進行其他處理。

整體流程
篩選:使用 Where 子句和 Lambda 表達式,從 studentList 中篩選出年齡介於 13 到 19 歲的學生。
投影:使用 Select 子句和 Lambda 表達式,將篩選後的學生物件投影成新的匿名物件,只包含姓名和年齡。
遍歷:使用 ToList() 將查詢結果轉換成 List,然後使用 ForEach 和 Lambda 陳述式,對每個匿名物件執行輸出操作。



圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言