---
# System prepended metadata

title: C#LIKE 查詢
tags: [C#]

---

# C#LIKE 查詢
LIKE 查詢主要用於 資料庫查詢 和 DataTable / BindingSource 過濾
>Thx ThatGPT~

[TOC]
##  在 SQL 查詢中使用 LIKE
當使用 ADO. NET 或 Entity Framework (EF) 來查詢 SQL Server、MySQL 或 SQLite 時，可以使用 LIKE 來進行模糊搜尋。

### 🔹 ADO. NET - 手動 SQL 查詢
如果你使用 ADO. NET 來執行 SQL 查詢，可以這樣寫：
```csharp=
using (SqlConnection conn = new SqlConnection("your_connection_string"))
{
    conn.Open();
    string query = "SELECT * FROM Customers WHERE Name LIKE @name";
    
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        cmd.Parameters.AddWithValue("@name", "%John%"); // 查詢包含 "John" 的名字
        SqlDataReader reader = cmd.ExecuteReader();
        
        while (reader.Read())
        {
            Console.WriteLine(reader["Name"]);
        }
    }
}
```
✅ LIKE @name：使用 參數化查詢 避免 SQL Injection（SQL 注入攻擊）。
✅ "%John%"：代表 Name 欄位包含 "John" 的所有記錄。
### 🔹 Entity Framework (EF) - LINQ to SQL
如果你使用 Entity Framework (EF)，可以用 .Contains() 來模擬 LIKE '%XXX%'：
```csharp=
using (var db = new MyDbContext())
{
    var results = db.Customers
                    .Where(c => c.Name.Contains("John")) // 等同於 LIKE '%John%'
                    .ToList();
    
    foreach (var customer in results)
    {
        Console.WriteLine(customer.Name);
    }
}
```
✅ Contains("John") ➝ LIKE '%John%'
✅ StartsWith("John") ➝ LIKE 'John%'
✅ EndsWith("John") ➝ LIKE '%John'
## 在 DataTable 或 BindingSource 使用 LIKE
在 WinForms 應用程式，可以使用 BindingSource.Filter 來過濾 DataGridView 顯示的資料。

### 🔹 使用 BindingSource.Filter
```csharp=
bindingSource1.Filter = "Name LIKE '%John%'";
```
這表示 DataGridView 只會顯示 Name 包含 "John" 的資料。
如果 LIKE 條件來自 使用者輸入的 TextBox：
```csharp=
string keyword = textBox1.Text.Replace("'", "''"); // 防止 SQL 錯誤
bindingSource1.Filter = $"Name LIKE '%{keyword}%'";
```
✅ 適用於：DataGridView、ListBox、ComboBox 綁定的 DataTable
✅ 不適用於：List< T >（需要使用 LINQ 來過濾）
## 在 List< T > 使用 LIKE 替代方案
在 C# 的 List< T > 沒有 LIKE，但可以用 LINQ 的 .Where() 搭配 Contains() 來模擬：
```csharp=
List<Customer> customers = GetCustomers(); // 取得客戶清單

// 查找名字包含 "John" 的資料
var results = customers.Where(c => c.Name.Contains("John")).ToList();

foreach (var customer in results)
{
    Console.WriteLine(customer.Name);
}
```
這段程式碼等效於 SQL 的：
```csharp=
SELECT * FROM Customers WHERE Name LIKE '%John%'
```
✅ 優點：不用資料庫，適用於 List< T >
✅ 缺點：區分大小寫（可以用 .ToLower() 解決）

### 🔹 忽略大小寫的 LIKE 查詢
```csharp=
var results = customers.Where(c => c.Name.ToLower().Contains("john")).ToList();
```
## 多條件 LIKE 查詢
如果要 多個條件，例如 Name LIKE '%John%' AND City LIKE '%York%'，可以這樣寫：

🔹 在 SQL 查詢
```csharp=
SELECT * FROM Customers WHERE Name LIKE '%John%' AND City LIKE '%York%'
```
在 SQL 裡，LIKE '%@like%' 不會正確地代入參數，因為 '%@like%' 是當作純文字處理了。
正確方式：應該在 C# 裡組好 %內容% 再傳進去。
```csharp=
comm.Parameters.AddWithValue("@LikePattern", $"%{textBox1.Text}%");
```

在 C# ADO .NET：
```csharp=
string query = "SELECT * FROM Customers WHERE Name LIKE @name AND City LIKE @city";
cmd.Parameters.AddWithValue("@name", "%John%");
cmd.Parameters.AddWithValue("@city", "%York%");
```
🔹 在 Entity Framework
```csharp=
var results = db.Customers
    .Where(c => c.Name.Contains("John") && c.City.Contains("York"))
    .ToList();
```
🔹 在 BindingSource
```csharp=
bindingSource1.Filter = "Name LIKE '%John%' AND City LIKE '%York%'";
```
## 總結
| 使用方式               | 查詢示例                                      |
|------------------------|-----------------------------------------------|
| SQL 查詢 (LIKE in SQL) | SELECT * FROM Table WHERE Name LIKE '%John%'  |
| ADO .NET                | cmd.Parameters.AddWithValue("@name", "%John%")|
| Entity Framework       | .Where(c => c.Name.Contains("John"))        |
| DataTable / BindingSource | bindingSource1.Filter = "Name LIKE '%John%'" |
| List< T >(LINQ)         | .Where(c => c.Name.Contains("John"))        |

## 特定 開頭 範圍
查找 Key 以 A 到 C 開頭 的項目：
```csharp=
var result = record.Where(kv => "ABC".Contains(kv.Key[0]));

foreach (var item in result)
{
    Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
```
✅ 這樣會找到 Alice、Bob、Charlie。
## LIKE '%text2%'（模擬 Contains()）
查找 Key 或 Value 包含 text2 的項目：
```csharp=
string searchText = "ar";  // 搜尋 "ar"

var result = record.Where(kv => kv.Key.Contains(searchText) || kv.Value.Contains(searchText));

foreach (var item in result)
{
    Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
```
```csharp=
var listResult = result.ToList();  // 轉成 List
var dictResult = result.ToDictionary(kv => kv.Key, kv => kv.Value); // 轉成 Dictionary
var firstItem = result.FirstOrDefault(); // 取得第一筆資料
int count = result.Count(); // 符合條件的數量
```
✅ 這樣會找到 Charlie (Artist)，因為 "ar" 存在於 "Charlie" 和 "Artist" 中。
## LIKE 'text2%'（模擬 StartsWith()）
查找 以 text2 開頭 的 Key 或 Value：
```csharp=
string searchText = "A";  // 搜尋 "A"

var result = record.Where(kv => kv.Key.StartsWith(searchText) || kv.Value.StartsWith(searchText));

foreach (var item in result)
{
    Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
```
## LIKE '%text2'（模擬 EndsWith()）
查找 以 text2 結尾 的 Key 或 Value：
```csharp=
string searchText = "r";  // 搜尋 "r"

var result = record.Where(kv => kv.Key.EndsWith(searchText) || kv.Value.EndsWith(searchText));

foreach (var item in result)
{
    Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
```
這樣會找到 Doctor 和 Engineer，因為它們是 "r" 結尾。







