用于可重用日期时间过滤器的谓词
本文关键字:过滤器 谓词 时间 日期 用于 | 更新日期: 2023-09-27 18:04:02
我有许多包含日期时间的对象。我发现我正在重用lambda语句:
Where(x => EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) &&
EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate));
在许多位置。我想用一个谓词替换这个表达式,该谓词可以在我的具有日期的对象列表中使用。
如果startDate
和endDate
是类级变量,您可以使用方法:
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将关闭两个局部变量(startDate
和endDate
),如果重用单个委托,则可能导致行为发生变化,除非范围始终保持不变。
一个选项是创建一个helper方法:
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));
定义另一个谓词方法,检查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));
注意,它将捕获startDate
和endDate
变量。
可以将表达式定义为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);