【发布时间】:2013-08-01 10:09:42
【问题描述】:
我想创建类似这样的 lambda
user => user.Address == address
但是没有编译一个,我想返回LambdaExpression
如果 lambda 像这样取常数
user => user.Age == 50
那我可以用这个方法
public static LambdaExpression PropertyEqual(Type tEntityType, string propertyName, object value)
{
// entity => entity.PropName == const
var itemParameter = Expression.Parameter(tEntityType, "entity");
return Expression.Lambda
(
Expression.Equal
(
Expression.Property
(
itemParameter,
propertyName
),
Expression.Constant(value) // Tried to replace this with Expression.Parameter or Expression.Variable but no luck
),
new[] { itemParameter }
);
}
如何使这个方法接受变量address 来自 lambda 表达式之外的范围?
var addressPropertyName = "Address";
var address = new Address() {...};
var q = Repo.GetQuery().Where(PropertyEqual(typeof(User), addressPropertyName, address))
编辑:澄清我的问题:如何构建正确的Expression 来生成第一个 lambda?
更新:这是不可能的,因为EF does not support non-scalar variable
我按照here 的建议将 lambda 更改为 user => user.AddressId == addressId。这只是如何从已知的导航属性Address 获取AddressId FK PropertyInfo 的问题。
【问题讨论】:
标签: c# linq entity-framework lambda entity-framework-5