2

假设我有两个参数:

参数 1 一个表达式,它接受一个 T 并从中获取相关产品的 ID

Expression<Func<T,int>> prodIdProperty = x=>x.Product.Id

参数 2 一个要与之比较的 productid ,比方说

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...
}

我需要这个,因为我想将它作为谓词传递给我的 EF Where 子句,这意味着我不能包含我的 prodIdProperty 的编译版本,因为它需要调用不支持的 Invoke()

(我已经尝试在这个问题中以另一种方式提出我的问题,但我认为我在那里过于复杂了)

4

1 回答 1

8

听起来你想要这样的东西:

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
    }
}
于 2012-09-03T16:11:03.760 回答