Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可重用datetime筛选器的谓词_C#_Date_Filter_Predicate - Fatal编程技术网

C# 可重用datetime筛选器的谓词

C# 可重用datetime筛选器的谓词,c#,date,filter,predicate,C#,Date,Filter,Predicate,我有许多包含日期时间的对象。我发现我在重复使用lambda语句: Where(x => EntityFunctions.TruncateTime(x.Date.Value) >= EntityFunctions.TruncateTime(startDate) && EntityFunctions.TruncateTime(x.Date.Value) <= EntityFunctions.TruncateTime(endDate)); Where(x=>

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

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

EntityFunctions.TruncateTime(x.Date.Value)定义另一个谓词方法,该方法将检查
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);
}

请注意,它将捕获您的
开始日期
结束日期
变量。

您可以将表达式定义为函数:

Func<object,bool> exp = 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));
}
但是,如果它们是局部变量,则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;
}

请不要只是要求我们为您解决问题。请向我们展示您自己是如何尝试解决问题的,然后向我们展示结果,并告诉我们为什么您觉得它不起作用。请参阅“”这是一篇你真正需要阅读的优秀文章。你是在寻找
DateTime.Date
?更具体地说,
EntityFunctions.TruncateTime
DateTime.Date
?是
startDate
endDate
局部变量还是类级变量?我基本上有一个列表,每个对象都有一个日期变量perty.startDate和endDate将是一个我可以传入的范围。根据我到目前为止读到的内容,我相信它看起来像:List newList=myList.Find(IsInRange(DateTime.Now,DateTime.Now.AddDays(7));我已尝试将其设置为谓词和函数。@AustinSalonen-EntityFunctions.TruncateTime内置于.Net中,允许您在lambda表达式中使用实体框架时忽略DateTime对象的时间部分。@JohnSaunders-感谢您的链接。以后,我将尝试改进我的初始问题和d给出更多关于我尝试过的细节。只有当
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);
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));