OData - 如何查询大于或等于给定值的 DateTime

use*_*426 1 c# datetime odata asp.net-core-webapi

我正在尝试在 OData 服务中查询日期时间大于或等于给定值的数据。它没有按预期工作

我已阅读文档:

https://learn.microsoft.com/en-us/odata/webapi/datetime-support#filter-datetime

组件

  • 微软.AspNetCore.OData 7.4.0
  • 网络核心3
  • EF核心

重现步骤

我尝试过以下查询格式:

  1. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt 2020-01-01T23:59:59.99Z &$orderby=purchaseDateTime desc HTTP 500 - 从字符串转换日期和/或时间时转换失败。

  2. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt cast(2020-01-01T23:59:59.99Z,Edm.DateTimeOffset) &$orderby=purchaseDateTime desc 返回 HTTP 500 - 内部服务器错误

  3. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt datetime'2020-01-01T23:59:59.99Z' &$orderby=purchaseDateTime desc

在 OData 网站上,这有效

https://services.odata.org/V4/OData/OData.svc/Products?$filter=ReleaseDate%20gt%202002-12-30T23:59:59.99Z

预期结果

根据查询返回数据,与http://services.odata.org响应的方式相同

实际结果

HTTP 错误请求或 HTTP 500

微软表示这应该有效:

GET ~/Customers?$filter=Birthday lt cast(2015-04-01T04:11:31%2B08:00,Edm.DateTimeOffset)
GET ~/Customers?$filter=year(Birthday) eq 2010
Run Code Online (Sandbox Code Playgroud)

我尝试过的其他信息来源:

  1. 使用 ODATA 过滤 x 和 y 之间的日期
  2. ODATA日期查询
  3. 日期时间范围的 OData 查询过滤器

Mic*_*ang 5

对于你的前两个查询,它对我有用。

 https://localhost:44339/odata/Patients?$filter=city eq 'Kigali' 
                                and purchaseDateTime gt 2020-01-01T23:59:59.99Z 
                                &$orderby=purchaseDateTime desc
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

 https://localhost:44339/odata/Patients?$filter=City eq 'Kigali' 
                                and PurchaseDateTime gt cast(2020-01-01T23:59:59.99Z,Edm.DateTimeOffset)
                                &$orderby=PurchaseDateTime desc
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是 的代码model

public class Patient
{
    public ulong PatientId { get; set; }
    public string Name { get; set; }

    public string City { get; set; }

    public DateTime PurchaseDateTime { get; set; }

    public ICollection<PatientForms> PatientForms { get; set; }
}
Run Code Online (Sandbox Code Playgroud)