Mic*_*lle 3 c# expression entity-framework
假设我有两个参数:
参数1一个表达式,它接受一个T并从中获取相关产品的ID
Expression<Func<T,int>> prodIdProperty = x=>x.Product.Id
Run Code Online (Sandbox Code Playgroud)
参数2 a productid与之比较,比方说
int productid = 5;
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以运行时将这个(在代码中)转换为一个新的表达式,如下所示:
Expression<Func<T,bool>> prodIdProperty = x=>x.Product.Id == 5
Run Code Online (Sandbox Code Playgroud)
我基本上需要这样的东西:
Expression<Func<T,bool>> TransformToPredicate(Expression<Func<T,int>> prodIdProperty,int productid){
//insert expression transform magic I don't seem to grasp...
}
Run Code Online (Sandbox Code Playgroud)
我需要这个,因为我想将它作为谓词传递给我的EF Where子句,这意味着我不能包含我的prodIdProperty的编译版本,因为它需要调用Invoke()不支持
(我已经尝试过在这个问题上用另一种方式解决我的问题,但我认为我在那里过于复杂)
这听起来像你想要的东西:
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);
}
Run Code Online (Sandbox Code Playgroud)
示例代码显示它的运行情况:
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1970 次 |
| 最近记录: |