如何使用 .NET Core WebAPI 和 OData v4 过滤 SQL Server DateTime

And*_*ijo 7 odata odata-v4 asp.net-core asp.net-core-webapi

我正在使用 OData Query v4 和 SQL Server 2012 运行一个简单的 .NET Core WebApi 应用程序。

这可行,但速度非常慢:

GET /api-endpoint?$filter=date(MyDateTimeField) ge 2018-01-01&$top=100
Run Code Online (Sandbox Code Playgroud)

由上面的 URL 生成的 SQL 查询:

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

当我尝试这样做时:

GET /api-endpoint?$filter=MyDateTimeField ge 2018-01-01T00:00:00.00Z&$top=100
Run Code Online (Sandbox Code Playgroud)

它生成以下 SQL 查询:

SELECT TOP 100 * FROM MyTable WHERE [MyDateTimeField] > '2018-01-01T00:00:00.0000000'
Run Code Online (Sandbox Code Playgroud)

返回此错误:

从字符串转换日期和/或时间时转换失败。

OData 查询语法是什么来生成与此类似的 SQL 查询?

SELECT TOP 100 * FROM MyTable WHERE [MyDateTimeField] > '2018-01-01'
Run Code Online (Sandbox Code Playgroud)

itm*_*nus 4

假设 的字段MyDateTimeField代替datetime,首先用列注释datatime2修饰:MyDateTimeField[Column(TypeName="datetime")]

public class MyTable
{
    // ...  other props

    [Column(TypeName="datetime")]
    public DateTime MyDateTimeField {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

要使用 进行查询datetimecast请将其转换为DateTimeOffset

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

生成的内容sql类似于:

  SELECT ..., [$it].[MyDateTimeField], 
  FROM [MyTable] AS [$it]
  WHERE [$it].[MyDateTimeField] >= '2018-01-01T08:00:00.000'
Run Code Online (Sandbox Code Playgroud)

注意datetime上面是2018-01-01T08:00:00.000代替2018-01-01T00:00:00.0000000.

演示截图:

在此输入图像描述