# 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" 結尾。