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 равны.
Примечание: первая и вторая строки нужны только для эксперимента, после решения проблемы их быть не должно.
Разница в выполнении данных строк:
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'
И он у вас также срабатывать не должен, если вы никаких преобразований с полем в БД не выполняете.
Сравнение будет корректно если обращаться к сообщениям не напрямую в базу данных. Например я сделал так:
IEnumerable<Message> msgs = db.Messages;
foreach (Message msg in msgs.Where(m => m.Date.CompareTo(Date) > 0))
Сборка персонального компьютера от Artline: умный выбор для современных пользователей