首頁 >後端開發 >C++ >如何使用 Lambda/LINQ 在資料庫欄位中有效率地搜尋多個關鍵字?

如何使用 Lambda/LINQ 在資料庫欄位中有效率地搜尋多個關鍵字?

Patricia Arquette
Patricia Arquette原創
2025-01-21 12:09:13321瀏覽

How to Efficiently Search for Multiple Keywords in a Database Field Using Lambda/LINQ?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn