Lambda表达式:如何分析委托如何存储为表达式?

时间:2011-05-16 05:01:03

标签: linq linq-to-entities expression-trees

此代码:

var lambda = Products.Where( p => p.name == "chair");

可以像这段代码一样编写:

var propertyName = "name";
var value = "chair";
var arg = Expression.Parameter(typeof(Product), "p");
var property = typeof(Product).GetProperty(propertyName);
var comparison = Expression.Equal(
    Expression.MakeMemberAccess(arg, property),
    Expression.Constant(value));
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();

如果我有这样的Lambda表达式:

Products.Where( p => p.name.Contains("chair") );

我怎样才能确定如何像上面那样编写表达式?有没有办法“调试”表达式树,以便我可以手动编程?

编辑:

我看到了有希望的答案here,但它并没有结束工作代码。这是他们的版本(错误是StartsWith方法被赋予非字符串值):

ParameterExpression p = Expression.Parameter(typeof(Product), "p");
MethodInfo method = typeof(string).GetMethod("StartsWith", 
    new[] { typeof(string) });
var containsMethodExp = Expression.Call(p, method, 
    Expression.Constant("root"), p);

1 个答案:

答案 0 :(得分:2)

让编译器完成工作。

如果你不是

func<string,bool> MyLambda = p => p.name.Contains("chair");

Expression<func<string,bool>> MyExpression = p => p.name.Contains("chair");

然后你得到一个很好的“MyExpression”,你可以在调试器中检查。