LINQ to Entities - 比较日期

时间:2011-06-22 06:42:44

标签: c# linq datetime date linq-to-entities

有更好的(更好/更有效)的方法吗?

return View(db.Things
    .Where(t => t.DateTimeObj.Month == DateTime.Today.Month 
        && t.DateTimeObj.Day == DateTime.Today.Day)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

以下内容不起作用(LINQ to Entites中没有Date对象)。

今天的记录:

return View(db.Things
    .Where(t => t.DateTimeObj.Date == DateTime.Today)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

过去24小时记录:

return View(db.Things
    .Where(t => t.DateTimeObj > DateTime.Today.AddHours(-24))
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

修改

这似乎可以解决问题:

return View(db.Things
    .Where(t => t.DateTimeObj > SqlFunctions.DateAdd("dd", -1, DateTime.Now))
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

Chris Sainty指出的可能的问题:

  1. 仅限SQL Server(可能?)
  2. 日期计算由SQL Server执行,因为它选择在linq2sql转换中提供预先计算的日期。

2 个答案:

答案 0 :(得分:3)

查看msdn上的SqlFunctions类,它提供对sql datediff等函数的访问。

请注意,它们不能用于在C#中运行代码,它们只是查询解析器理解并可以转换为T-SQL的占位符。显然这只是SQL Server,除非其他提供程序已经包装了这些函数。

答案 1 :(得分:2)

只需在手边宣布'比较'日期

var today = DateTime.Today;
return View(db.Things
    .Where(t => t.DateTimeObj.Date == today)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

//Last 24 hours records:
var yesterday = DateTime.Now.AddDays(-1);
return View(db.Things
    .Where(t => t.DateTimeObj > yesterday)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);