Как преобразовать строку в DateTime в C# EF Core запросе - PullRequest
2 голосов
/ 01 апреля 2020
var res = Context.Exampletable
                 .Where(s => s.CompanyId == CompanyId &&  
                             Convert.ToDateTime(s.TextDate) >= DateTime.Now)
                 .Select(x => new Exampletable { TextDate = x.TextDate })
                 .FirstOrDefault();

Это Linq для одного из моих заявлений о проблеме. Я хочу получить записи будущих записей дат из текущей даты и метки времени, поэтому я конвертирую и сравниваю их с Datetime, но получаю эту ошибку:

Выражение LINQ 'DbSet
.Where (a => Convert.ToDateTime (a.TextDate)> Convert.ToDateTime (DateTime.Now)) '> не удалось перевести. Либо переписать запрос в форме, которую можно перевести, либо явным образом переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ()

Примечание: в столбце Postgresql DB TextDate указан строковый тип данных и такие значения, как '4/1/2020 10:00 AM'.

Пожалуйста, предоставьте решение для этого.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Меня всегда сбивает с толку, что люди решают сохранить значения DateTime в виде строк, а затем приказывают пользователям базы данных выполнять вычисления со значениями. Я могу себе представить, что вы хотели бы проклясть человека, который решил сделать это, особенно потому, что он решил хранить его в несортируемом виде.

Лучшее решение

Если возможно, измените база данных, в которой он хранит DateTimes как DateTimes, или, если язык вашей базы данных не знает, как это сделать, сохраняйте тики DateTimes как длинные. Будущие пользователи базы данных прославят ваше имя!

long nowTicks = DateTime.Now.Ticks;
var result = Context.Exampletable
    .Where(example => example.CompanyId == CompanyId && example.DateTicks >= nowTicks);

Почти лучшее решение

, если решение о сохранении DateTimes в виде строк является решением разработчиков PostgreSQL, тогда попробуйте выясните, есть ли у них функции для обработки этих дат, особенно сравнения

Решение "становится все хуже"

Попытайтесь выяснить, есть ли PostgreSQL функции для работы со строками, так что вы можете перевести 4 / 1/2020 10:00 утра во что-то похожее. Сложно, если вы хотите написать код для сравнения этого значения, например, с 4/4/2019 10:00 AM или 4/2/2020 10:00 AM, поэтому я полагаю, что это будет адская работа в SQL

0 голосов
/ 01 апреля 2020

Если вы действительно не можете изменить базовый тип столбца, тогда вместо неподдерживаемого Convert.ToDateTime используйте оператор приведения C#, который сопоставляется с оператором PostgreSQL CAST:

(DateTime)(object)s.TextDate >= DateTime.Now

Обратите внимание, что "промежуточное" приведение к object необходимо только для того, чтобы сделать компилятор C# счастливым.


PS Я действительно понятия не имею, почему некоторые методы Convert, такие как ToInt32 поддерживаются, а другие как ToDateTime - нет. Полагаю, еще одно несоответствие EF Core.

...