Construire une expression Linq spécifique en fonction d'une autre expression LINQ et d'une valeur
-
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.
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