LINQ to EF4 проблемы сравнения даты и времени - PullRequest
2 голосов
/ 14 сентября 2011

У меня проблема при сравнении значения столбца smalldatetime / datetime из БД (SQL Server 2008) с DateTime.Now в C #.Я знаю, что формат даты и времени в БД и на сервере, на котором выполняется приложение, различаются, поэтому я сделал что-то вроде этого, чтобы «кэшировать» результаты, чтобы сравнение даты и времени было локальным и не было на сервере:

var inactiveAccounts = (from entry in ent.Accounts
                           where entry.Status == 0                                           
                           select entry).ToArray();

var accountsFiltered = (from entry in inactiveAccounts
                     where entry.DeactivationDate < DateTime.Now
                     select entry).ToArray(); 

И в какой-то момент дня я не получаю правильные записи.

Я подозреваю, что это связано с , где entry.DeactivationDate сравнение дат.И, кажется, в EF сложно работать с datetime, пожалуйста, помогите мне определить проблему.

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Не знаю, решит ли это вашу проблему, но я бы создал локальную переменную и установил DateTime.Now .Затем используйте локальную переменную в вашем запросе linq.

Это сделано, потому что DateTime.Now оценивается в вашем запросе каждый раз, когда вызывается предложение where.Так что для каждой записи в inactiveAccounts вы работаете с другим DateTime.

Также, если вы хотите сравнить Dates без значения Time, вы должны использовать DateTime.Today

var inactiveAccounts = (from entry in ent.Accounts
                       where entry.Status == 0                                           
                       select entry).ToArray();

DateTime currentDateTime = DateTime.Now;

var accountsFiltered = (from entry in inactiveAccounts
                 where entry.DeactivationDate < currentDateTime 
                 select entry).ToArray(); 
0 голосов
/ 14 сентября 2011

Вы можете использовать это напрямую:

var inactiveAccounts = (from entry in ent.Accounts
                        where entry.Status == 0 && entry.DeactivationDate < DateTime.Now                  
                        select entry).ToArray();

Поскольку DataTime.Now и DateTime.UtcNow переводятся как канонические функции = они не должны оцениваться на стороне .NET, но переводятся вGETDATE() или GETUTCDATE() Вызовы функций SQL соответственно.

Остальная часть вашего вопроса не может быть решена, поскольку я предоставляю такую ​​информацию, как

И в какой-то период дня я не получаю правазаписи.

Вы должны приложить гораздо больше усилий для анализа проблемы, если вы хотите получить ответ, включая сведения о том, какие периоды вызывают проблемы, какие часовые пояса используются и т. д. Как правило, мы не поможем вам в этом, посколькумы не видим ваши данные.Это также не проблема EF, потому что в вашем случае это происходит полностью в коде linq-to-object = plain .NET.

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