我尝试了以下(显然没有//),但是我无法工作,有人可以帮忙吗?
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();
}
答案 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的字面翻译,很可能不会支持它。