我有许多包含日期时间的对象。我发现我正在重用lambda语句:
Where(x => EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) &&
EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate));
在许多地方。我想用一个谓词替换这个表达式,该谓词可以在我的带有日期的对象列表中使用。
答案 0 :(得分: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));
请注意,它会捕获您的startDate
和endDate
变量。
答案 1 :(得分: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);
答案 2 :(得分:1)
如果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
),如果重新使用单个委托,这可能会导致行为发生变化,除非范围是总是保持不变。
一种选择可能是制作辅助方法:
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));