当我使用
时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();
系统将返回预期结果。谁能告诉我发生了什么事?
提前致谢!
答案 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();