Создайте конкретное выражение LINQ на основе другого выражения LINQ и значения - PullRequest
2 голосов
/ 16 мая 2011

Если у меня есть выражение LINQ вида:

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

Можно ли как-нибудь найти приведенное ниже выражение?

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

Мне нужно использовать второе выражение в вызове Linq-to-Entities Where.

Ответы [ 2 ]

1 голос
/ 16 мая 2011

На случай, если это будет полезно, я решил:

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]);
1 голос
/ 16 мая 2011

Вам нужно написать ExpressionVisitor, который заменит ParameterExpression на ConstantExpression.

Это будет выглядеть примерно так:

protected override Expression VisitParameter(ParameterExpression node) {
    if (node.Name == "filterVal")
        return Expression.Constant(something);
    return node;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...