Heim > Backend-Entwicklung > C++ > Wie kann man mit Lambda/LINQ effizient nach mehreren Schlüsselwörtern in einem Datenbankfeld suchen?

Wie kann man mit Lambda/LINQ effizient nach mehreren Schlüsselwörtern in einem Datenbankfeld suchen?

Patricia Arquette
Freigeben: 2025-01-21 12:09:13
Original
298 Leute haben es durchsucht

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

Lambda/LINQ-Datenbankfeldsuche mit mehreren Schlüsselwörtern

In diesem Artikel wird erläutert, wie Sie Lambda/LINQ-Ausdrücke verwenden, um gleichzeitig effizient nach mehreren Schlüsselwörtern in Datenbankfeldern (z. B. Kommentarfeldern) zu suchen. Mit der herkömmlichen Contains-Methode kann jeweils nur nach einem Schlüsselwort gesucht werden, während mit der in diesem Artikel bereitgestellten Methode mehrere Schlüsselwörter gleichzeitig verarbeitet werden können.

Mit Lambda-Ausdrücken können Sie Abfragen wie diese schreiben:

<code class="language-csharp">var newList = MainList.Where(m => m.Comments.Contains(purposes));</code>
Nach dem Login kopieren

Wenn Sie jedoch nach mehreren Schlüsselwörtern suchen müssen, sind fortgeschrittenere Techniken erforderlich. Zu diesem Zweck haben wir eine Erweiterungsmethode entwickelt:

<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>
Nach dem Login kopieren

Diese Erweiterungsmethode empfängt die Hauptliste MainList, die Schlüsselwortliste items, einen Lambda-Ausdruck filterPattern (der verwendet wird, um zu prüfen, ob das Schlüsselwort im Feld Comments vorhanden ist) und einen booleschen Wert isOr (gibt die Verwendung von OR- oder AND-Operatoren zum Abgleichen von Schlüsselwörtern an).

Zum Beispiel:

<code class="language-csharp">var newList = MainList
    .FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true)
    .ToList();</code>
Nach dem Login kopieren

Diese Abfrage gibt eine Liste von Datensätzen zurück, deren Feld Comments ein beliebiges Schlüsselwort in der Liste keywords enthält.

Implementierung der FilterByItems-Erweiterungsmethode

Die Erweiterungsmethode

FilterByItems nutzt die Klasse ExpressionReplacer, um einen Ausdruck rekursiv zu ändern, um bestimmte Teile durch den gewünschten Wert zu ersetzen.

Das Folgende ist die Implementierung der ExpressionReplacer-Klasse:

<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>
Nach dem Login kopieren

Diese verbesserte Beschreibung erklärt klarer, was der Code tut und wie er verwendet wird, und erläutert wichtige Abschnitte ausführlicher.

Das obige ist der detaillierte Inhalt vonWie kann man mit Lambda/LINQ effizient nach mehreren Schlüsselwörtern in einem Datenbankfeld suchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage