给定一个原始值age
,我知道如何创建这样的表达式:
//assuming: age is an int or some other primitive type
employee => employee.Age == age
通过做这个:
var entityType = typeof(Employee);
var propertyName = "Age";
int age = 30;
var parameter = Expression.Parameter(entityType, "entity");
var lambda = Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, propertyName),
Expression.Constant(age)
)
, parameter);
除非在所讨论的属性和常量不是原始类型的情况下,否则效果很好。
如果比较是在对象之间,我将如何构造一个类似的表达式?
使用 EF 我可以写:
Location location = GetCurrentLocation();
employees = DataContext.Employees.Where(e => e.Location == location);
这也有效,但如果我尝试创建相同的表达式:
var entityType = typeof(Employee);
var propertyName = "Location";
var location = GetCurrentLocation();
var parameter = Expression.Parameter(entityType, "entity");
var lambda = Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, propertyName),
Expression.Constant(location)
)
, parameter);
我收到一条错误消息:
Unable to create a constant value of type 'Location'. Only primitive types or enumeration types are supported in this context.
我的怀疑是Expression.Constant()
只需要原始类型,所以我需要使用不同的表达式工厂方法。(也许Expression.Object
?-我知道那不存在)
有没有办法创建一个比较对象的表达式?如果它是一个编译的 LINQ 语句,为什么 EF 能够正确解释它,但当它是一个表达式时却不能?