2013-03-15 51 views
1

我有一些包含日期时间的对象。我发现我正在重复使用lambda语句:重复使用日期时间过滤器的谓词

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

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

+1

请不要只问我们要解决的问题为您服务。告诉我们你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“[您尝试过什么?](http://whathaveyoutried.com/)”,以获得一篇您最近需要阅读的优秀文章。 – 2013-03-15 17:08:07

+0

你在找'DateTime.Date'吗?更具体地说,“EntityFunctions.TruncateTime”与“DateTime.Date”有什么不同? – 2013-03-15 17:09:51

+0

“startDate”和“endDate”本地或类级变量? – 2013-03-15 17:11:18

回答

1

如果startDateendDate是一流水平的变量,你可以只使用一个方法:

var results = myobjects.Where(FilterDate); 

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

这将随后通过被称为

但是,如果他们是本地人,您的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)); 
+0

里德,我相信这非常接近我试图实现的目标。我没有考虑使用辅助函数。今天晚些时候我会试试这个。谢谢! – user1506863 2013-03-15 17:27:46

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变量。与任何类型是你正在使用

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

更换对象:

+1

只有当'startDate'和'endDate'是类级变量,而不是本地语言时,这才会起作用。 – 2013-03-15 17:10:07

+0

更新了我的答案。感谢您的注意。使谓词静态化,以便明显地表明,他不访问私有对象的状态 – 2013-03-15 17:15:07

1

您可以定义表达式作为Func键。然后通过Func键在哪里:

Where(exp);