2011-05-16 59 views
2

如果我有以下形式的LINQ表达特定的LINQ表达式:构建基于另一个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调用中使用第二个表达式。

+0

能否这项工作?表达式> filter = x => filterExpression.Compile()(x,“John”); – kerem 2012-02-27 21:12:23

+0

Linq-to-Entities将无法将已编译的表达式序列化为SQL。 – sipwiz 2012-02-27 21:38:30

回答

1

您需要编写一个ExpressionVisitor,用ConstantExpression代替​​。

它看起来像

protected override Expression VisitParameter(ParameterExpression node) { 
    if (node.Name == "filterVal") 
     return Expression.Constant(something); 
    return node; 
} 
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]); 
相关问题