如果我有一个表格的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 :(得分: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]);