Как фильтровать SQL Server DateTime с использованием .NET Core WebAPI с OData v4 - PullRequest
3 голосов
/ 10 мая 2019

Я запускаю простое приложение .NET Core WebApi с OData Query v4 и SQL Server 2012.

Это работает, но очень медленно:

GET /api-endpoint?$filter=date(MyDateTimeField) ge 2018-01-01&$top=100

SQL-запрос, сгенерированныйURL выше:

SELECT TOP 100 * FROM MyTable WHERE ((((DATEPART(year, [MyDateTimeField]) * 10000) + (DATEPART(month, [MyDateTimeField]) * 100)) + DATEPART(day, [MyDateTimeField])) >= (((2018 * 10000) + (1 * 100)) + 1))

Когда я пытаюсь сделать это:

GET /api-endpoint?$filter=MyDateTimeField ge 2018-01-01T00:00:00.00Z&$top=100

Он генерирует следующий запрос SQL:

SELECT TOP 100 * FROM MyTable WHERE [MyDateTimeField] > '2018-01-01T00:00:00.0000000'

, который возвращает эту ошибку:

Не удалось выполнить преобразование при преобразовании даты и / или времени из символьной строки.

Каким будет синтаксис запроса OData для создания запроса SQL, аналогичного этому?

SELECT TOP 100 * FROM MyTable WHERE [MyDateTimeField] > '2018-01-01'

1 Ответ

0 голосов
/ 13 мая 2019

Предполагая, что поле MyDateTimeField равно datetime вместо datatime2, украсьте MyDateTimeField аннотацией столбца [Column(TypeName="datetime")] во-первых:

public class MyTable
{
    // ...  other props

    [Column(TypeName="datetime")]
    public DateTime MyDateTimeField {get;set;}
}

Для запроса с datetime, cast в DateTimeOffset:

?$filter=MyDateTimeField ge cast(2018-01-01T00:00:00.00Z,Edm.DateTimeOffset)

Сгенерированный sql выглядит примерно так:

  SELECT ..., [$it].[MyDateTimeField], 
  FROM [MyTable] AS [$it]
  WHERE [$it].[MyDateTimeField] >= '2018-01-01T08:00:00.000'

Обратите внимание, что datetime выше 2018-01-01T08:00:00.000 вместо 2018-01-01T00:00:00.0000000.

Скриншот демонстрации:

enter image description here

...