---
# System prepended metadata

title: C#LINQ(微SQL)
tags: [SQL, C#]

---

# C#LINQ (微SQL)
類似於用來查詢、篩選、排序和處理資料集合的東西
上面的都是C#程式，下面的是SQL有進行標示
>ChatGPT資料整理

[TOC]
## 基本 LINQ 語法 (from ... where ... select ...)
* from：指定資料來源 (from p in products)
* where：過濾條件 (where p.Price > 500)
* select：選擇回傳的資料 (select p.Name)
```csharp=
var result = from 變數 in 集合
             where 條件
             select 變數;
```

### 簡單應用：
products是一個集合，裡面有需多資料
p將資料提取出來進行比對，如果>100就加入資料
```csharp=
var result = from p in products
             where p.Price > 100
             select p;
```
```csharp=
// 移除空格或非數字字符
cardNumber = new string(cardNumber.Where(char.IsDigit).ToArray());
```
SQL
```sql=
SELECT * FROM Products WHERE Price > 100;
```
## LINQ to Objects(list、array)
```csharp=
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// 取出所有偶數
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
```
n=>n  為將n傳入到(=>)另一端n
再進行條件判斷n % 2 == 0

SQL
```sql=
SELECT * FROM Numbers WHERE Number % 2 = 0;
```
## LINQ to DataTable
```csharp=
var query = from row in dataTable.AsEnumerable()
            where row.Field<int>("Age") > 30
            select row;
```
SQL
```sql=
SELECT * FROM dataTable WHERE Age > 30;
```

## Select 選取特定欄位
```csharp=
var productNames = products.Select(p => p.Name).ToList();
```

SQL
```sql=
SELECT Name FROM Products;
```
## OrderBy 排序
### 順序排序
```csharp=
var sortedProducts = products.OrderBy(p => p.Price).ToList();
```
SQL
```sql=
SELECT * FROM Products ORDER BY Price;
```
### 降序排序
```csharp=
var sortedProductsDesc = products.OrderByDescending(p => p.Price).ToList();
```
SQL
```sql=
SELECT * FROM Products ORDER BY Price DESC;
```
## GroupBy 群組
```csharp=
var groupedProducts = products.GroupBy(p => p.Category)
                              .Select(g => new { Category = g.Key, Count = g.Count() })
                              .ToList();
```
SQL
```sql=
SELECT Category, COUNT(*) FROM Products GROUP BY Category;
```
## Join 兩個表格關聯
```csharp=
var query = from p in products
            join c in categories on p.CategoryId equals c.Id
            select new { p.Name, c.CategoryName };
```
SQL
```sql=
SELECT p.Name, c.CategoryName FROM Products p
JOIN Categories c ON p.CategoryId = c.Id;
```
## FirstOrDefault 取得第一筆
```csharp=
var product = products.FirstOrDefault(p => p.Name == "Laptop");
```
SQL
```sql=
SELECT TOP 1 * FROM Products WHERE Name = 'Laptop';
```
## Any 檢查是否有符合條件的資料
* 若有至少一個符合條件的元素 → Any() 回傳 true
* 若沒有符合條件的元素 → Any() 回傳 false
```csharp=
bool hasExpensiveProduct = products.Any(p => p.Price > 1000);
```
SQL
```sql=
SELECT CASE WHEN EXISTS (SELECT * FROM Products WHERE Price > 1000) THEN 1 ELSE 0 END;
```
## Count 計算數量
取出 大於100值 的資料數量
```csharp=
int count = products.Count(p => p.Price > 100);
```
SQL
```sql=
SELECT COUNT(*) FROM Products WHERE Price > 100;
```
## 分頁 Skip 和 Take
分頁 ，幫助你從資料庫中 跳過前 n 筆資料並取得 m 筆資料。
* Skip(n)：跳過前 n 筆資料。
* Take(m)：從目前查詢的結果中，取出最多 m 筆資料。

✅ 例 1：簡單用法
```csharp=
var users = db.Users
    .OrderBy(x => x.Id) // 先排序，確保跳過的順序一致
    .Skip(5)  // 跳過前 5 筆
    .Take(10) // 取出 10 筆
    .ToList();
```
這樣你會拿到 第 6 到第 15 筆資料。
1. 跳過前 5 筆資料
1. 取出 10 筆資料

✅ 例 2：分頁用法
* pageSize (每頁顯示的筆數)
* pageNumber (當前頁數)

如果你想取得 第 pageNumber 頁的資料，每頁 pageSize 筆：
```csharp=
int pageSize = 10; // 每頁 10 筆
int pageNumber = 2; // 取得第 2 頁

var users = db.Users
    .OrderBy(x => x.Id) // 先排序，確保資料順序固定
    .Skip((pageNumber - 1) * pageSize) // 跳過前 (頁數 - 1) * 每頁筆數
    .Take(pageSize) // 取出 pageSize 筆資料
    .ToList();
```
這樣會取得第 11 到第 20 筆資料。

📌 公式：
```scss=
Skip((pageNumber - 1) * pageSize) -> 跳過前幾頁的所有資料
Take(pageSize) -> 取出當前頁的資料
```
✅ 例 3：應用在 ASP.NET Core API
如果你要 建立一個 API 來支援前端分頁，可以這樣寫：
```csharp=
[HttpGet("users")]
public IActionResult GetUsers(int pageNumber = 1, int pageSize = 10)
{
    var users = db.Users
        .OrderBy(x => x.Id)
        .Skip((pageNumber - 1) * pageSize)
        .Take(pageSize)
        .ToList();

    return Ok(users);
}
```
* pageNumber = 1 時，取 第 1 到 10 筆資料
* pageNumber = 2 時，取 第 11 到 20 筆資料
* 依此類推...

✅ 例 4：搭配 Where 條件篩選
如果你想要 查詢某個條件，然後再分頁：
```csharp=
var users = db.Users
    .Where(x => x.Age > 18) // 只查詢年齡大於 18 的使用者
    .OrderBy(x => x.Name) // 依照 Name 排序
    .Skip(10) // 跳過前 10 筆
    .Take(5) // 取出 5 筆
    .ToList();
```
這樣你會取得 符合條件的使用者，並跳過前 10 筆後，取出 5 筆。

SQL
```sql=
SELECT * 
FROM Users
ORDER BY Id ASC
OFFSET 10 ROWS      -- 跳過前 10 筆
FETCH NEXT 5 ROWS ONLY;  -- 取出 5 筆
```





