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>
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>
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>
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 ErweiterungsmethodeFilterByItems
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>
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!