C #: Why is one of my .Where () conditions missing in my SQL query?

I have a method with the following line of executable code. It should receive all messages created in the last 24 hours, and will not be created in the future (because it should not be possible).

messages.AddRange(_dbcontext.Messages
                .Where(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24) && message.CreationTime <= DateTime.UtcNow)
                .ToList());

When the application starts and passes the above line, this is the SQL query that was executed:

SELECT [message].[Id], [message].[CreationTime], [message].[Value]
FROM [Messages] AS [message]
WHERE([message].[CreationTime] <= GETUTCDATE())

This basically retrieves all messages, not those created in the last 24 hours.

I want to know why this part of Where () is ignored or not converted to an SQL query, and what I can do to make it work.

(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24)
+4
source share
2 answers

SQL- EF Core 2.0 ( DateTime, AddHours, AddDays ..), . , , where , .

EF Core 2.0, SQL ( ):

SELECT [message].[Id], [message].[CreationTime], [message].[Value]
FROM [Messages] AS [message]
WHERE ([message].[CreationTime] >= DATEADD(hour, -24E0, GETUTCDATE())) AND ([message].[CreationTime] <= GETUTCDATE())

, EF Core 2.0, EF, DateTime.UtcNow.AddHours(-24) .

+6

- EF DateTime SQL-, :

DateTime dayBefore = DateTime.UtcNow.AddHours(-24);
messages.AddRange(_dbcontext.Messages
                  .Where(message => message.CreationTime >= dayBefore && message.CreationTime <= DateTime.UtcNow)
                  .ToList());

, EF, , -, , :

messages.AddRange(_dbcontext.Messages
            .Where(message => message.CreationTime >= EntityFunctions.AddHours(DateTime.UtcNow, -24) && message.CreationTime <= DateTime.UtcNow)
            .ToList());

, .


EntityFunctions DbFunctions, .

messages.AddRange(_dbcontext.Messages
            .Where(message => message.CreationTime >= DbFunctions.AddHours(DateTime.UtcNow, -24) && message.CreationTime <= DateTime.UtcNow)
            .ToList());
+2

Source: https://habr.com/ru/post/1683947/


All Articles