Heim >Backend-Entwicklung >C++ >Wie kann ich OR-Logik in einer dynamischen LINQ-WHERE-Klausel effizient implementieren?
Im vorherigen Artikel wurde eine Methode zum Erstellen dynamischer Abfragen mithilfe der verzögerten LINQ-Ausführung vorgestellt. Diese Abfrage verwendet jedoch eine AND-Bedingung, um die WHERE-Klausel zu verknüpfen. In diesem Artikel wird untersucht, wie Sie diese Methode anpassen können, um stattdessen die ODER-Logik zu verwenden.
Das spezifische Ziel besteht darin, eine Abfrage zu erstellen, die nach Benutzern basierend auf ihrem Benutzernamen, Windows-Benutzernamen oder beiden sucht (bestimmt durch die bereitgestellte IdentifierType-Enumeration). Die geänderte GetUser-Methode lautet wie folgt:
<code>public User GetUser(IdentifierType type, string identifier) { using (var context = contextFactory.Invoke()) { var query = from u in context.Users select u; var pred = Predicate.False<User>(); if (type.HasFlag(IdentifierType.Username)) pred = pred.Or(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) pred = pred.Or(u => u.WindowsUsername == identifier); return query.Where(pred.Expand()).FirstOrDefault(); // 或者 return query.AsExpandable().Where(pred).FirstOrDefault(); } }</code>
Der Schlüssel zur Implementierung der OR-Logik liegt im PredicateBuilder der LINQKit-Bibliothek. Es ermöglicht die dynamische Prädikatkonstruktion und kann in Verbindung mit Entity Framework verwendet werden. Prädikate beginnen mit Predicate.False und werden basierend auf dem IdentifierType-Flag dynamisch geändert.
Die Expand()-Methode ist von entscheidender Bedeutung, da Entity Framework keine aufrufenden Ausdrücke unterstützt. AsExpandable() aktiviert den Ausdrucksaccessor von LINQKit und konvertiert den Ausdruck in eine Form, die Entity Framework verarbeiten kann. Ohne diese Angabe kommt es zu einer „Invoke“-Ausnahme.
Ein anderer Ansatz besteht darin, den Prädikat-Builder von Pete Montgomery zu verwenden, der die gleiche Funktionalität ausführt, ohne dass Expand() erforderlich ist.
Das obige ist der detaillierte Inhalt vonWie kann ich OR-Logik in einer dynamischen LINQ-WHERE-Klausel effizient implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!