2012-04-23 46 views
2

我试过以下(显然没有//),但我无法得到任何工作,请任何人帮忙吗?Linq如果DateTime字段大于X小时

public void CleanBasket() 
    { 
     //double validHours = 3; 
     // var expired = (from a in db.Baskets where (DateTime.Now - a.DateCreated).TotalHours > validHours select a); 
     //var expired = (from a in db.Baskets where (DateTime.Now.Subtract(a.DateCreated).Hours > 3) select a); 
     //var expired = (from a in db.Baskets where(a => a.DateCreated > DateTime.Now.AddHours(-1)); 
     //foreach (Basket basket in expired) db.DeleteObject(expired); 
     db.SaveChanges(); 
    } 
+1

什么不起作用?你在编译时遇到错误吗?运行?或没有得到正确的结果? – aqwert 2012-04-23 23:44:45

+3

我试着回答这个问题,但我无法得到我的工作答案。 – 2012-04-23 23:45:18

+0

这是行不通的? 'var dt = DateTime.Now.AddHours(-3); var expired = from a in db.Baskets where a.DateCreated dtb 2012-04-23 23:58:33

回答

11

在这种情况下,当然你可以简单地做你的约会时间计算调用LINQ之前:

double validHours = 3; 
var latest = DateTime.UtcNow.AddHours(-validHours); 
var expired = (from a in db.Baskets where a.DateCreated < latest select a); 

为此你需要在数据库中做和不能做这种方式,您的任何更复杂的DateTime操作可以使用SqlFunctions

顺便说一句,你应该存储你的时间在Utc不是当地时间。使用DateTime.Now的计算在夏时制时间更改期间将会错误。

+0

我不得不使用** DateTime.UtcNow **而不是** DateTime.Utc **。不确定这是一个版本问题还是需要更新答案。 – 2016-06-13 01:48:27

1

我的猜测是linq-to-entities不知道如何使用DateTime.Now操作来制定查询。要做到这一点,我会得到一个列表中的值,然后用linq,将它们过滤掉。

public void CleanBasket() 
    { 
     var cutoff = DateTime.Now.Subtract(new TimeSpan(3, 0, 0)); 
     var baskets = db.Baskets.Where(a=>a.DateCreated<cutoff); 
     db.DeleteObjects(baskets); // You can combine this with the last line 
     db.SaveChanges(); 
    } 
+0

你不应该鼓励人们这样做。在测试中,所有东西都能正常工作,直到它在生产中崩溃,并在单个查询中返回几百条记录... – Pedro 2012-04-24 00:09:38

+0

@Pedro - 同意,但是如果他想要在Linq-To-Ef中执行此操作而不调用服务器上的SPROC,我不确定Linq-To-Ef可以将时间跨度转换为有效的查询。 – Matt 2012-04-24 00:11:13

+1

@Pedro,我实际上改变它只是计算截止日期,两全其美。 – Matt 2012-04-24 00:16:50

1

这极有可能是一个ORM将无法转换时间跨度操作,检查这个问题,它可能会有所帮助:Comparing dates in query using LINQ

基本上你可以考虑,如果你正在使用的方法不对SQL有一个直接的转换,它很可能不会被支持。