如何从Expression <func <,=“”>&gt;?创建委托(将参数传递给表达式)?

时间:2016-01-03 09:09:53

标签: c# linq datetime expression

我有以下过滤器:

Expression<Func<Employee, bool>> fromDateFilterFourDays = z => EntityFunctions.TruncateTime(z.FiringDate) >= EntityFunctions.TruncateTime(DateTime.Now.AddDays(-4));

Expression<Func<Employee, bool>> fromDateFilterSixDays = z => EntityFunctions.TruncateTime(z.FiringDate) >= EntityFunctions.TruncateTime(DateTime.Now.AddDays(-6));

如何从此过滤器中创建委托?

我不想为每个给定的数字创建一个变量,即四天或六天。

3 个答案:

答案 0 :(得分:2)

我的理解是你要:

  1. 向代表,员工和天数提供两个参数。
  2. 将该表达式编译为委托。
  3. 第一部分可以通过在参数列表中添加日期来完成:

    Expression<Func<Employee, int, bool>> fromDateFilter = (z, n) => EntityFunctions.TruncateTime(z.FiringDate) >= EntityFunctions.TruncateTime(DateTime.Now.AddDays(n));
    

    第二个使用Compile方法:

    var del = fromDateFilter.Compile();
    // use it
    del(employee, -4);
    

答案 1 :(得分:0)

这是通过调用Invoke()方法完成的:

fromDateFilterFourDays.Invoke(employee);

或者你可以Compile()将表达式转换为func,然后调用func:

var fromDateFilterFourDaysFunc = fromDateFilterFourDays.Compile();

fromDateFilterFourDaysFunc(employee);

答案 2 :(得分:0)

您可以使用Expression<Func<...>>方法轻松将Func<...>转为Compile

但是,请记住,您提供的示例表达式将不起作用,因为它们使用的Canonical Functions只是用于映射相应数据库SQL函数的占位符,并且如果您尝试实际评估它们将抛出异常(这将发生在Func)。

另一方面,如果问题实际上是如何对样本表达式进行参数化,则可能是这样的

static Expression<Func<Employee, bool>> DateFilter(int currentDateOffset)
{
    return e => EntityFunctions.TruncateTime(e.FiringDate) >= DateTime.Today.AddDays(currentDateOffset);
}