假设我有两个参数:
参数 1 一个采用 T 并从中获取关联产品 ID 的表达式
Expression<Func<T,int>> prodIdProperty = x=>x.Product.Id
参数 2 是一个要与之比较的产品ID,比方说
int productid = 5;
有什么方法可以在运行时将其(在代码中)转换为如下新表达式:
Expression<Func<T,bool>> prodIdProperty = x=>x.Product.Id == 5
我基本上需要这样的东西:
Expression<Func<T,bool>> TransformToPredicate(Expression<Func<T,int>> prodIdProperty,int productid){
//insert expression transform magic I don't seem to grasp...
}
我需要这个,因为我想将它作为谓词传递给我的 EFWhere 子句,这意味着我不能包含我的 prodIdProperty 的编译版本,因为它需要调用 Invoke() ,但不支持
(我已经尝试以另一种方式表述我的问题this https://stackoverflow.com/questions/12212721/generic-extension-method-on-queryable-crashes-on-invoke-when-converting-express问题,但我认为我把它弄得太复杂了)
听起来你想要类似的东西:
Expression<Func<T, bool>> TransformToPredicate(
Expression<Func<T, int>> prodIdProperty,
int productId)
{
Expression equals = Expression.Equal(prodIdProperty.Body,
Expression.Constant(productId));
return Expression.Lambda<Func<T, bool>>(equals, prodIdProperty.Parameters);
}
显示其实际效果的示例代码:
using System;
using System.Linq.Expressions;
class Test
{
static Expression<Func<T, bool>> TransformToPredicate<T>(
Expression<Func<T, int>> prodIdProperty,
int productId)
{
Expression equals = Expression.Equal(prodIdProperty.Body,
Expression.Constant(productId));
return Expression.Lambda<Func<T, bool>>(equals, prodIdProperty.Parameters);
}
static void Main()
{
Expression<Func<string, int>> length = x => x.Length;
var predicate = TransformToPredicate(length, 5);
var compiled = predicate.Compile();
Console.WriteLine(compiled("Hello")); // True
Console.WriteLine(compiled("Foo")); // False
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)