Heim >Backend-Entwicklung >C++ >Wie kann ich OR-Logik in einer dynamischen LINQ-WHERE-Klausel effizient implementieren?

Wie kann ich OR-Logik in einer dynamischen LINQ-WHERE-Klausel effizient implementieren?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-22 05:06:09605Durchsuche

How Can I Efficiently Implement OR Logic in a Dynamic LINQ WHERE Clause?

Verwenden Sie LINQKit, um die OR-Logik der dynamischen WHERE-Klausel zu verbessern

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!

Stellungnahme:
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