Construire une expression Linq spécifique en fonction d'une autre expression LINQ et d'une valeur

StackOverflow https://stackoverflow.com/questions/6012689

  •  14-11-2019
  •  | 
  •  

Question

Si j'ai une expression linq de la forme:

Expression<Func<MyClass, string, bool>> filterExpression = (x, filterVal) => x.DisplayName.Contains(filterVal);

Y a-t-il un moyen de pouvoir accéder à l'expression ci-dessous?

Expression<Func<MyClass, bool>> filter = x => x.DisplayName.Contains("John");

J'ai besoin d'utiliser la deuxième expression dans une entités linq où l'appel.

Était-ce utile?

La solution

Vous devez écrire un ExpressionVisitor qui remplace le ParameterExpression avec un ConstantExpression.

Ça ressemblerait à quelque chose comme

protected override Expression VisitParameter(ParameterExpression node) {
    if (node.Name == "filterVal")
        return Expression.Constant(something);
    return node;
}

Autres conseils

Dans le cas où c'est utile comme je l'ai résolu: c'était:

public class MyVisitor : ExpressionVisitor
{
    protected override Expression VisitParameter(ParameterExpression node)
    {
        Console.WriteLine("Visiting Parameter: " + node.Name);
        if (node.Name == "filterVal")
        {
            return Expression.Constant("John");
        }
        return node;
    }
}

Expression<Func<MyClass, string, bool>> filterExpression = (x, filterVal) => x.DisplayName.Contains(filterVal);
var filterExpBody = (new MyVisitor()).Visit(filterExpression.Body);
Expression<Func<MyClass, bool>> filter = Expression.Lambda<Func<MyClass, bool>>(filterExpBody, filterExpression.Parameters[0]);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top