Linq如果DateTime字段早于X小时

时间:2012-04-23 23:41:07

标签: c# linq linq-to-entities

我尝试了以下(显然没有//),但是我无法工作,有人可以帮忙吗?

    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();
    }

3 个答案:

答案 0 :(得分:14)

在这种情况下,您可以在调用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进行计算会出错。

答案 1 :(得分: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();
    }

答案 2 :(得分:1)

ORM很可能无法翻译TimeSpan操作,请查看此问题可能会有所帮助:Comparing dates in query using LINQ

  

基本上你可以考虑,如果你使用的方法没有对SQL的字面翻译,很可能不会支持它。