Lambda/LINQ多關鍵字資料庫欄位搜尋
本文介紹如何使用Lambda/LINQ表達式有效率地在資料庫欄位(例如Comments欄位)中同時搜尋多個關鍵字。 傳統的Contains
方法一次只能搜尋一個關鍵字,而本文提供的方法可以同時處理多個關鍵字。
使用Lambda表達式,你可以這樣寫查詢:
<code class="language-csharp">var newList = MainList.Where(m => m.Comments.Contains(purposes));</code>
然而,如果你需要搜尋多個關鍵字,則需要更進階的技巧。為此,我們開發了一個擴充方法:
<code class="language-csharp">public static IQueryable<T> FilterByItems<T, TItem>(this IQueryable<T> query, IEnumerable<TItem> items, Expression<Func<T, TItem, bool>> filterPattern, bool isOr)</code>
這個擴充方法接收主列表MainList
,關鍵字列表items
,以及一個Lambda表達式filterPattern
(用來檢查關鍵字是否存在於Comments
欄位中),以及一個布林值isOr
(指定使用OR或AND運算符來匹配關鍵字)。
例如:
<code class="language-csharp">var newList = MainList .FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true) .ToList();</code>
此查詢將傳回Comments
欄位包含keywords
清單中任一個關鍵字的記錄清單。
FilterByItems擴充方法的實作
FilterByItems
擴充方法利用ExpressionReplacer
類別遞歸地修改表達式,以取代特定部分為所需的值。
以下是ExpressionReplacer
類別的實作:
<code class="language-csharp">public static class QueryableExtensions { public static IQueryable<T> FilterByItems<T, TItem>(this IQueryable<T> query, IEnumerable<TItem> items, Expression<Func<T, TItem, bool>> filterPattern, bool isOr) { Expression predicate = null; foreach (var item in items) { var itemExpr = Expression.Constant(item); var itemCondition = ExpressionReplacer.Replace(filterPattern.Body, filterPattern.Parameters[1], itemExpr); if (predicate == null) predicate = itemCondition; else { predicate = Expression.MakeBinary(isOr ? ExpressionType.OrElse : ExpressionType.AndAlso, predicate, itemCondition); } } predicate ??= Expression.Constant(false); var filterLambda = Expression.Lambda<Func<T, bool>>(predicate, filterPattern.Parameters[0]); return query.Where(filterLambda); } // ... (ExpressionReplacer class remains the same) ... }</code>
這個改進後的描述更清楚地解釋了程式碼的功能和使用方法,並對關鍵部分進行了更詳細的說明。
以上是如何使用 Lambda/LINQ 在資料庫欄位中有效率地搜尋多個關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!