[英]Rewrite Lambda expression with System.Linq.Expressions APIs
我被困在这几个小时。 我想要做的就是通过使用Expression类API重写以下表达式来构建表达式树:
var Expression<Func<T, bool>> expr = x => x.SomeProperty == value;
到目前为止我得到的是:
{
var param = Expression.Parameter(typeof(T), "x");
var lhs = Expression.Property(param, "SomeProperty");
var rhs = Expression.Constant(value, value.GetType());
return Expression.Call(typeof(object).GetMethod("Equals", BindingFlags.Static | BindingFlags.Public), lhs, rhs);
}
如果T
是基本类型或枚举,这可以正常工作。 但是如果T是引用类型, class
等,我会遇到异常。
例外消息:
无法创建“
TypeName
”类型的常量值。 在此上下文中仅支持基元类型或枚举类型。
提前致谢。
在这种情况下,您不需要显式指定类型,只要该值不为null(我假设它不是,因为您在其上调用GetType()
)。
这应该做到这一点。
var param = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(param, "SomeProperty");
var compareValue = Expression.Constant(value);
var equals = Expression.Equal(property, compareValue);
return Expression.Lambda<Func<T, bool>>(equals, param);
生成的表达式传递给Linq Where
调用。 像这样。
Context.Sources.Where(criteria.BuildQuery());
在评估/翻译表达式时抛出异常。
如果我编译表达式然后将委托传递给Where
调用,一切都按预期工作。
Context.Sources.Where(criteria.BuildQuery().Compile());
我不知道它有什么不同,如果有人知道为什么请开导我们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.