基于另一个LINQ表达式和值构建特定的LINQ表达式

时间:2011-05-16 02:29:40

标签: linq-to-entities linq-expressions

如果我有一个表格的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 个答案:

答案 0 :(得分:1)

您需要撰写ExpressionVisitor,用ParameterExpression替换ConstantExpression

看起来像

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

答案 1 :(得分: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]);