почему datetime.now не работает, когда я не использовал tolist? - PullRequest
1 голос
/ 17 июня 2010

Когда я использую

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 ]

4 голосов
/ 17 июня 2010

Лучше всего предположить, что настройки времени на сервере базы данных отличаются от настроек на компьютере разработчика (или компьютере, на котором работает .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 голос
/ 17 июня 2010

Зачем использовать несколько .Where()?

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

также будет работать.

Этот ответ также может помочь вам понять, почему он не работает должным образом: Можно ли объединить несколько скомпилированных запросов linq?

0 голосов
/ 17 июня 2010

Проверьте результат в отладчике, чтобы увидеть разницу между временем сервера базы данных и местным временем.

var result = datacontext.News
  .Take(1)
  .Select(n => DateTime.Now)
  .ToList()
  .Select(x => new {SqlTime = x, LocalTime = DateTime.Now})
  .Single();
0 голосов
/ 17 июня 2010

Это разница между сравнениями дат оценки .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.

0 голосов
/ 17 июня 2010

Я думаю, что вы должны спросить это так ...

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

или

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

"== true" только помогает немного лучше понять, что по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...