1

我有许多包含日期时间的对象。我发现我正在重用 lambda 语句:

Where(x => EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) &&
    EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate));

在多个位置。我想用一个谓词替换这个表达式,该谓词可以在我的带有日期的对象列表中使用。

4

3 回答 3

1

定义另一个谓词方法,它将检查是否YourType有正确的日期

private static bool IsObjectHasNeccesaryDate(YourType obj, DateTime startDate, DateTime endDate)
{
    return EntityFunctions.TruncateTime(obj.Date.Value) >= EntityFunctions.TruncateTime(startDate) 
        && EntityFunctions.TruncateTime(obj.Date.Value) <= EntityFunctions.TruncateTime(endDate);
}

然后您可以使用 lambda 语法来使用它,如下所示:

myobjects.Where(obj => IsObjectHasNeccesaryDate(obj, startDate, endDate));

请注意,它将捕获您的startDateendDate变量。

于 2013-03-15T17:09:30.443 回答
1

您可以将表达式定义为 Func:

Func<object,bool> exp = x => 
    EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) 
    && EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate);

用您正在使用的任何类型替换对象。然后将 Func 传递给 Where:

Where(exp);
于 2013-03-15T17:11:32.463 回答
1

如果startDateendDate是类级别的变量,你可以只使用一个方法:

bool FilterDate(YourEntityType x)
{
    return EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) &&
           EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate));
}

这将通过以下方式调用:

var results = myobjects.Where(FilterDate);

但是,如果它们是本地变量,则您的 lambda 将关闭两个局部变量 (startDateendDate),如果您重用单个委托,这可能会导致行为发生变化,除非范围始终保持不变。

一种选择可能是制作一个辅助方法:

static Func<YourEntityType, bool> CreateFilter(DateTime startDate, DateTime endDate)
{
     Func<YourEntityType, bool> func = x => EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) &&
EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate));
     return func;
}

然后你可以这样写:

var results = myobjects.Where(CreateFilter(startDate, endDate));
于 2013-03-15T17:16:35.403 回答