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