asp.net-core - 如何使用带有 OData v4 的 .NET Core WebAPI 过滤 SQL Server DateTime
问题描述
我正在使用 OData Query v4 和 SQL Server 2012 运行一个简单的 .NET Core WebApi 应用程序。
这有效,但速度非常慢:
GET /api-endpoint?$filter=date(MyDateTimeField) ge 2018-01-01&$top=100
上面的 URL 生成的 SQL Query:
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'
返回此错误:
从字符串转换日期和/或时间时转换失败。
生成与此类似的 SQL 查询的 OData 查询语法是什么?
SELECT TOP 100 * FROM MyTable WHERE [MyDateTimeField] > '2018-01-01'
解决方案
假设字段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
.
Demo截图:
推荐阅读
- ruby-on-rails - ActiveRecord Rollback 跳过模型级错误作为响应
- java - Eclipse JDT 在项目中的 lombok 时生成错误的 ast
- javascript - Mapbox GL JS:显示纬度,经度位置
- reactjs - 重定向到页面的问题 - 我现在是新手
- node.js - git checkout 后恢复 Angular 项目
- php - 通过显示日期乘以 2 的下拉日期菜单
- c# - 如何在 MOQ 中使用 new 关键字模拟在方法内部创建的类对象
- python-2.7 - 仅使用 python 从网站抓取内部链接
- angular - onchange 函数在 Angular js 中不起作用
- nightwatch.js - 由于 Run.js,无法运行守夜脚本