为什么datetime.now不工作时我没有使用tolist?

时间:2010-06-17 11:16:00

标签: asp.net linq linq-to-sql

当我使用

datacontext.News
    .Where(p => p.status == true)
    .Where(p => p.date <= DateTime.Now)
    .ToList();

系统将不返回任何结果;

当我使用

datacontext.News
    .Where(p => p.status == true)
    .ToList()
    .Where(p => p.date <= DateTime.Now)
    .ToList();

系统将返回预期结果。谁能告诉我发生了什么事?

提前致谢!

5 个答案:

答案 0 :(得分:4)

我最好猜测数据库服务器上的时间设置与开发人员计算机(或运行.NET的计算机)上的时间设置不同。

两个片段之间的区别在于,在第二个片段中,条件p.date <= DateTime.Now在本地执行,而不是在数据库服务器上执行。

如果您想使用当地时间,可以这样做:

var now = DateTime.Now;
var newNews = datacontext.News
    .Where(p => p.status == true)
    .Where(p => p.date <= now)
    .ToList();

答案 1 :(得分:1)

为什么要使用多个.Where()

datacontext.News
    .Where(p => p.status && p.date <= DateTime.Now)
    .ToList();

也可以。

这个答案也可以帮助您理解为什么它不能按预期工作:Can multiple compiled linq queries be chained together?

答案 2 :(得分:0)

我认为你需要这样问......

datacontext.News
    .Where(p => p.status == true && p.date <= DateTime.Now)
    .ToList();

datacontext.News
    .Where(p => p.status && p.date <= DateTime.Now)
    .ToList();

“== true”只有助于更好地理解问题。

答案 3 :(得分:0)

.NET评估日期比较和SQL之间的区别; ToList()执行响应,所以我认为第二个使用LINQ to Objects。对于日期比较,您还可以考虑使用SqlMethods

http://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods_members.aspx

所以你可以使用:

SqlMethods.DateDiffDay(d1, d2) > 0

如果日期不适合你。

HTH。

答案 4 :(得分:0)

在调试器中查看结果,以查看数据库服务器的时间与本地时间之间的差异。

var result = datacontext.News
  .Take(1)
  .Select(n => DateTime.Now)
  .ToList()
  .Select(x => new {SqlTime = x, LocalTime = DateTime.Now})
  .Single();