繁体   English   中英

使用System.Linq.Expressions API重写Lambda表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM