Я использую Microsoft.EntityFrameworkCore.SqlServer v2.1.2 (а также пробовал v2.2.0-preview1-35029) и использую LINQ для получения коллекции сущностей из базы данных Azure SqlServer, фильтрация по полю DateTime.
Однако SQL, сгенерированный оператором LINQ, использует строковое значение DateTime, которое SqlServer отклоняет с этой ошибкой:
Ошибка преобразования при преобразовании даты и / или времени из символьной строки.
Я могу изменить инструкцию SQL, чтобы изменить формат даты и времени, чтобы запрос работал без ошибок (подробности см. Ниже), но я не знаю, как заставить среду генерировать этот же формат даты и времени.
Хотя EntityFrameworkCore все еще нова, похоже, что это довольно простой вариант использования, поэтому я предполагаю, что я делаю что-то не так, и это не проблема фреймворка.
Как запретить EF генерировать недопустимое значение даты и времени в SQL?
и / или
Как заставить сгенерированный SQL использовать другой формат для объектов DateTime?
Модель EntityFramework, которую я использую, выглядит следующим образом:
public class DeskReading
{
public int DeskReadingId { get; set; }
//... some other fields ...
public DateTime Timestamp { get; set; }
}
И мой LINQ для запроса значений выглядит так:
IQueryable<DeskReading> readings =
_dbContext.DeskReadings
.OrderBy(gr => gr.Timestamp)
.Where(gr => gr.Timestamp > new DateTime(2017, 05, 01));
readings.ToList();
И генерируемый SQL-код выглядит следующим образом:
SELECT [gr].[DeskReadingId] --...some other fields ...
FROM [DeskReadings] AS [gr]
WHERE [gr].[Timestamp] > '2017-05-01T00:00:00.0000000'
ORDER BY [gr].[Timestamp]
Обратите внимание, что значение фильтра '2017-05-01T00:00:00.0000000'
Если я запускаю этот SQL напрямую на SqlServer через SSMS, я получаю ту же ошибку:
Но если я поменяю фильтр на '2017-05-01 00:00:00'
, он будет работать нормально:
SELECT [gr].[DeskReadingId] --...some other fields ...
FROM [DeskReadings] AS [gr]
WHERE [gr].[Timestamp] > '2017-05-01 00:00:00'
ORDER BY [gr].[Timestamp]
В соответствии с просьбой, вот скрипт создания для таблицы:
CREATE TABLE [dbo].[DeskReadings](
[DeskReadingId] [int] IDENTITY(1,1) NOT NULL,
[SoilMoistureSensor1] [int] NOT NULL,
[SoilMoistureSensor2] [int] NOT NULL,
[LightLevel] [int] NOT NULL,
[TemperatureF] [real] NOT NULL,
[HumidityPercent] [real] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.DeskReadings] PRIMARY KEY CLUSTERED
(
[DeskReadingId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]