OData - как запросить DateTime больше или равное заданному значению - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь запросить в своей службе OData данные с datetime, большим или равным заданному значению. Он не работает должным образом

Я прочитал документацию:

https://docs.microsoft.com/en-us/odata/webapi/datetime-support#filter -datetime

Сборки :

  • Microsoft.AspNetCore.OData 7.4.0
  • NET Core 3
  • EF Core

Воспроизвести шаги

Я пробовал следующие форматы запросов:

  1. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt 2020-01-01T23:59:59.99Z &$orderby=purchaseDateTime desc HTTP 500 - Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

  2. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt cast(2020-01-01T23:59:59.99Z,Edm.DateTimeOffset) &$orderby=purchaseDateTime desc возвращает HTTP 500 - внутренняя ошибка сервера

  3. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt datetime'2020-01-01T23:59:59.99Z' &$orderby=purchaseDateTime desc

На сайте OData это работает

https://services.odata.org/V4/OData/OData.svc/Products? $ filter = ReleaseDate% 20gt% 202002-12-30T23: 59: 59.99Z

Ожидаемый результат

Возвращает данные в соответствии с запросом так же, как http://services.odata.org отвечает

Фактические результаты

Неверный запрос HTTP или HTTP 500

Microsoft сообщает th должно работать:

GET ~/Customers?$filter=Birthday lt cast(2015-04-01T04:11:31%2B08:00,Edm.DateTimeOffset)
GET ~/Customers?$filter=year(Birthday) eq 2010

Другие источники информации, которые я пробовал:

  1. Фильтрация дат между x и y с использованием ODATA
  2. ЗАПРОС ДАТЫ ODATA
  3. Фильтр запроса OData для диапазона dateTime

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Для первых двух запросов у меня работает.

 https://localhost:44339/odata/Patients?$filter=city eq 'Kigali' 
                                and purchaseDateTime gt 2020-01-01T23:59:59.99Z 
                                &$orderby=purchaseDateTime desc

enter image description here

 https://localhost:44339/odata/Patients?$filter=City eq 'Kigali' 
                                and PurchaseDateTime gt cast(2020-01-01T23:59:59.99Z,Edm.DateTimeOffset)
                                &$orderby=PurchaseDateTime desc

введите описание изображения здесь

Вот коды model.

public class Patient
{
    public ulong PatientId { get; set; }
    public string Name { get; set; }

    public string City { get; set; }

    public DateTime PurchaseDateTime { get; set; }

    public ICollection<PatientForms> PatientForms { get; set; }
}
0 голосов
/ 03 августа 2020

Я нашел решение.

Оказывается, это связано с EF Core и типом данных SQL столбца purchaseDateTime , который я запрашиваю

Данные хранится как SQL Тип данных: datetime

Не указывая явным образом, что он должен соответствовать SQL типу данных datetime, EF Core отправляет его как SQL Тип данных datetime2

Это источник ошибки: Conversion failed when converting date and/or time from character string

Решение

Модель должна явно указывать Тип столбца datetime, чтобы это выглядит так

public class Patient
{
    public ulong PatientId { get; set; }
    public string Name { get; set; }

    public string City { get; set; }

    [Column(TypeName="datetime")] //overrides default of "datetime2"
    public DateTime PurchaseDateTime { get; set; }

    public ICollection<PatientForms> PatientForms { get; set; }
}
...