Как использовать дату в пункте «Где» в EF Core? - PullRequest
0 голосов
/ 06 января 2020

Мне нужно отфильтровать свои запросы по датам, но в данном случае меня не волнует временная часть, которая хранится в SQL базе данных.

Сначала я попробовал что-то вроде

var now = DateTime.Now.Date;
Where(x => x.CreatedDate.Date.Compare(now) == 0)

но, похоже, все это проверяется локально, что замедляет запрос. Как я могу сделать это без локальной проверки?

Я в значительной степени пытаюсь найти все результаты, которые, по их словам, произошли сегодня (2020-01-06).

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Существует ограниченное количество методов, которые можно использовать в переводимых типах при построении выражений Lambda / Linq. Это связано с тем, что каждому методу потребуется дополнительный код, чтобы его можно было преобразовать в выражение sql store. Это означает, что вы должны проверить, поддерживаются ли любые методы, которые вы хотите использовать и ожидаете перевода в выражение хранилища sql.

В этом случае DateTime.Compare не поддерживается.

Самое простое, что можно сделать здесь, это простое сравнение диапазонов, потому что время включено в ваше постоянное значение.

var start = DateTime.Now.Date;
var end = start.AddDays(1);

Where(x => x.CreatedDate >= start && x.CreatedDate < end)

Это приведет к запросу sargable .

1 голос
/ 07 января 2020

Использовать

var now = DateTime.Now.Date
...WHERE(CreatedDate.Date == now)

Я только что проверил, что выше переводит на следующий SQL запрос:

WHERE ((CONVERT(date, [x].[CreatedDate]) = '2019-01-07T00:00:00.000')

Я использовал этот ( link ) метод для посмотрите, что LINQ переводит на

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