7

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

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

3 回答 3

17

在这种情况下,您当然可以在调用 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在夏令时更改期间使用的计算将是错误的。

于 2012-04-24T00:18:45.163 回答
2

我的猜测是 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();
    }
于 2012-04-24T00:06:35.500 回答
1

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

基本上您可以考虑,如果您使用的方法没有对 SQL 的直译,则很可能不支持它。

于 2012-04-24T00:13:30.943 回答