ホームページ >バックエンド開発 >C++ >Lambda/LINQ を使用してデータベースフィールド内の複数のキーワードを効率的に検索するにはどうすればよいですか?

Lambda/LINQ を使用してデータベースフィールド内の複数のキーワードを効率的に検索するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-21 12:09:13344ブラウズ

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

Lambda/LINQ マルチキーワード データベース フィールド検索

この記事では、Lambda/LINQ 式を使用して、データベース フィールド (コメント フィールドなど) 内の複数のキーワードを同時に効率的に検索する方法を紹介します。 従来の Contains メソッドでは一度に 1 つのキーワードしか検索できませんが、この記事で説明するメソッドでは複数のキーワードを同時に処理できます。

ラムダ式を使用すると、次のようなクエリを作成できます。

<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、ラムダ式 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。