2

次の形式の 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 番目の式を使用する必要があります。

4

2 に答える 2

1

それが役立つ場合、私が解決した方法は次のとおりです。

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]);
于 2011-05-16T04:06:22.013 に答える
1

ExpressionVisitorを に置き換えるan を記述する必要がありParameterExpressionますConstantExpression

それは次のようになります

protected override Expression VisitParameter(ParameterExpression node) {
    if (node.Name == "filterVal")
        return Expression.Constant(something);
    return node;
}
于 2011-05-16T02:41:22.540 に答える