3
我想創建拉姆達這樣的創建LambdaExpression包含外部變量
user => user.Address == address
但不編一個,我想回到LambdaExpression
如果拉姆達採取恆定這樣
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
生成第一拉姆達?
更新:因爲EF does not support non-scalar variable
我改變lambda來user => user.AddressId == addressId
的建議here這是不可能的。它只是此事如何讓AddressId
FK PropertyInfo
從已知的導航屬性Address
。
增加額外的參數將變成像'(用戶地址)=> user.Address == address',而不是'用戶=>用戶。地址== address'具有不同的返回式'表達>',而不是'表達>' –
CallMeLaNN
你不能得到一個「參考」給一個變量,並把它放在一個'表達'。 'TypedReference'和表達式樹不是「兼容的」。你可以做的是預先創建一個指向你的地址的表達式,然後組成這兩個表達式樹。閉包將由編譯器完成。 – xanatos
對不起,如何結合兩個表達式並返回'LambdaExpression'? 'Expression.Lambda(...)'只接受一個'Expression'體。 – CallMeLaNN