myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Linq Expressions verknüpfen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Linq Expressions verknüpfen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
ByteDevil ByteDevil ist männlich
myCSharp.de-Mitglied

avatar-4066.png


Dabei seit: 02.03.2013
Beiträge: 102
Entwicklungsumgebung: VS 2019 Pro


ByteDevil ist offline

Linq Expressions verknüpfen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beschreibung:

Hier sind zwei Erweiterungsmethoden für System.Linq.Expressions.Expression, welche es ermöglichen zwei Linq-Expressions logisch zu "verodern" bzw. zu "verunden". Der Code ist nicht von mir, nur leicht von mir angepasst. Weiß leider nicht mehr genau woher ich den habe, musste aber lange nach sowas suchen. Verwende es um eine Datenbankabfrage, unter Angabe eines Query Strings aus der URL eines Webservices, zu generieren.

C#-Code:
public static class ExpressionExtensions
{
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {
        var parameter = Expression.Parameter(typeof(T));

        var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
        var left = leftVisitor.Visit(expr1.Body);

        var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
        var right = rightVisitor.Visit(expr2.Body);

        return Expression.Lambda<Func<T, bool>>(
            Expression.AndAlso(left, right), parameter);
    }

    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {
        var parameter = Expression.Parameter(typeof(T));

        var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
        var left = leftVisitor.Visit(expr1.Body);

        var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
        var right = rightVisitor.Visit(expr2.Body);

        return Expression.Lambda<Func<T, bool>>(
            Expression.OrElse(left, right), parameter);
    }

    private class ReplaceExpressionVisitor : ExpressionVisitor
    {
        private readonly Expression _oldValue;
        private readonly Expression _newValue;

        public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
        {
            _oldValue = oldValue;
            _newValue = newValue;
        }

        public override Expression Visit(Expression node)
        {
            if (node == _oldValue)
                return _newValue;
            return base.Visit(node);
        }
    }
}

Verwendung:

C#-Code:
List<Expression<Func<string, bool>>> expressions = new List<Expression<Func<string, bool>>>();
expressions.Add(x => x.ToLower().Contains("foo") || x.ToLower().Contains("bar"));
expressions.Add(x => !x.ToLower().Contains("not this"));

var combinedExpression = expressions.Aggregate((x, y) => x.And(y));

Schlagwörter: Linq, Verknüpfen, Linq OR, Linq AND
02.10.2019 11:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 13.12.2019 22:43