Сравнивание DateTime

260
04 мая 2018, 10:45
        Message ms = db.Messages.FirstOrDefault(m => m.Id == 50);
        if (ms.Date.CompareTo(Date) > 0) { Console.WriteLine("I don't understand"); }
        foreach (Message msg in db.Messages.Where(m => m.Date.CompareTo(Date)>0))

В базе данных есть строка сообщения с Id=50 и определенным временем(это достоверная истина). Есть Date-дата, ее шлет мне клиент, которую я же ему и отослал сообщением с Id=50(с миллисекундами). Кажется, что условие во второй строке не должно срабатывать? Оно так и есть, но в третьей, кажется подобной строке на строке с Id=50 лямбда-выражение (m => m.Date.CompareTo(Date)>0) выдает true. К тому же свойство DateTime.Ticks и у 50-ого сообщения и у объекта Date равны.

Примечание: первая и вторая строки нужны только для эксперимента, после решения проблемы их быть не должно.

Answer 1

Разница в выполнении данных строк:
1 и 2 строка у вас происходит на стороне клиента, на стороне .NET

3 же строка будет выполнятся на стороне сервера. Когда вы написали вот так

foreach (Message msg in db.Messages.Where(m => m.Date.CompareTo(Date)>0))

У вас сгенерится запрос, подобный вот такому

exec sp_executesql N'SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[time] AS [time]
    FROM [dbo].[Targets] AS [Extent1]
    WHERE [Extent1].[time] > @p__linq__0',N'@p__linq__0 datetime2(7)',@p__linq__0='2017-05-02 21:00:00'

И он у вас также срабатывать не должен, если вы никаких преобразований с полем в БД не выполняете.

Answer 2

Сравнение будет корректно если обращаться к сообщениям не напрямую в базу данных. Например я сделал так:

IEnumerable<Message> msgs = db.Messages;
foreach (Message msg in msgs.Where(m => m.Date.CompareTo(Date) > 0))
READ ALSO
Partial методы в C#

Partial методы в C#

Какое практическое применение есть для partial методов?

235
Как записывать в файл из нескольких потоков?

Как записывать в файл из нескольких потоков?

Задача: записывать в файл данные из нескольких потоков

265
Не нажимается кнопка PhantomJS

Не нажимается кнопка PhantomJS

Пишет то , что истекло время ожидания

268
Как получить имя папки &ldquo;Мой компьютер&rdquo;

Как получить имя папки “Мой компьютер”

Как можно получить имя папки "Мой компьютер" для windows 10

265