Как использовать DateTimeOffset в запросе C# linq к базе данных

Я использую инфраструктуру сущностей и AutoMapper в своем проекте. В базе данных поля DatreTime изначально были созданы как поля строкового типа и остаются такими же (например, поля «DepartureTime» и «ArrivalTime»). Я пытаюсь выполнить сравнение DateTime в своем решении в запросе linq к dbContext, используя DateTimeOffset, чтобы преобразовать строку в DateTime. Но я получаю сообщение об ошибке

Я использую запрос:

db.Passengers
.Where(p => p.AreaOfVisit == area && DateTimeOffset.Parse(p.DepartureTime).UtcDateTime > incidentDate &&
                            DateTimeOffset.Parse(p.ArrivalTime).UtcDateTime < incidentDate).ProjectTo<PassengerDTO>()
                .ToList();

Я получаю это сообщение об ошибке.

System.NotSupportedException HResult=0x80131515 Message=LINQ to Entities не распознает метод «System.DateTimeOffset Parse(System.String)», и этот метод не может быть преобразован в выражение хранилища.

Что может быть лучшим способом решить эту проблему.


person sm101    schedule 19.09.2019    source источник
comment
Возможный дубликат LINQ to Entities не распознает метод 'System.DateTime ToDateTime(System.String)' метод   -  person Matt Luccas Phaure Minet    schedule 19.09.2019
comment
@mjwills p.DepartureTime и p.ArrivalTime являются строками. инцидентДате - это DateTime, который я пытаюсь сравнить в запросе linq.   -  person sm101    schedule 19.09.2019
comment
Я бы настоятельно предложил не хранить даты в виде строк в базе данных. Даже если вы решите эту конкретную проблему, вы будете испытывать бесконечную боль и горе. Укусите пулю прямо сейчас и отойдите от строк в базе данных.   -  person mjwills    schedule 19.09.2019
comment
@MattLuccasPhaureJensen Я попробовал то, что сказано в этой статье, изменив код на db.Passengers .Where(p => p.AreaOfVisit == area && Convert.ToDateTime(p.DepartureTime) › инцидентДата && Convert.ToDateTime(p.ArrivalTime) ‹ инцидентДата).ProjectTo‹PassengerDTO›() .ToList(); я получаю следующую ошибку: System.NotSupportedException LINQ to Entities не распознает метод «System.DateTime ToDateTime (System.String)», и этот метод не может быть преобразован в выражение хранилища.   -  person sm101    schedule 19.09.2019
comment
@ sm101 вам нужно будет сделать ToList() перед Where, потому что это вызывает проблему   -  person Matt Luccas Phaure Minet    schedule 19.09.2019
comment
Вместо ToDateTime используйте: DateTime.Parse(p.ArrivalTime)   -  person jdweng    schedule 19.09.2019
comment
@jdweng пытался. Получение этого System.NotSupportedException: «LINQ to Entities не распознает метод System.DateTime Parse (System.String)», и этот метод не может быть преобразован в выражение хранилища». Позвольте мне попробовать удалить ProjectTo()   -  person sm101    schedule 19.09.2019
comment
@jdweng n повезло, что этот LINQ to Entities не распознает метод «System.DateTime Parse (System.String)», и этот метод не может быть преобразован в выражение хранилища».   -  person sm101    schedule 19.09.2019
comment
Вам нужно ЗАЧЕТ собственности?   -  person jdweng    schedule 19.09.2019
comment
@mjwills yes, согласно вашему совету, изменил поле базы данных со строкового типа на DateTime. Теперь нет необходимости конвертировать внутри запроса linq   -  person sm101    schedule 19.09.2019
comment
Круто - вы сделали мудрый выбор.   -  person mjwills    schedule 19.09.2019