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)
假设 的字段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)
要使用 进行查询datetime,cast请将其转换为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.
演示截图:
| 归档时间: |
|
| 查看次数: |
1914 次 |
| 最近记录: |