oData v4 按日期时间过滤,字符串未转换为日期时间

问题描述 投票:0回答:1

我的URI:

$filter=IsActive eq true and IsAutomated eq true and WebSite ne null
    and WebSite ne '' and LastUpdated le 2018-12-30T23:59:59.99Z

控制器:

private readonly BrokerForgeContext _ctx;

[EnableQuery(PageSize = 20)]
[HttpGet]
public IActionResult Get()
{
    return Ok(_ctx.Locations);
}

启动:

private static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<CashBidPrice>("CashBidPrices");
    builder.EntitySet<Location>("Locations");

    builder.EntityType<CashBidPrice>().Collection.Function("DeleteToday").Returns<bool>();

    return builder.GetEdmModel();
}

实体模型:

public partial class Location
{
    [Key]
    public int LocationId { get; set; }
    public int? Loc_Id { get; set; }
    public string Name { get; set; }
    **[[ REMOVED FOR BREVITY ]]**
    public DateTime? LastUpdated { get; set; }
}

我想获取

LastUpdate
记录少于今天的所有位置,但在过滤
LastUpdated
记录时遇到一些重大问题。其他一切都很好。

错误:

处理请求时发生未处理的异常。 SqlException:从字符串转换日期和/或时间时转换失败。
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,ActionwrapCloseInAction)
TargetIncationException:调用目标已引发异常。
System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]参数,签名sig,布尔构造函数,布尔wrapExceptions)

c# .net rest asp.net-core odata
1个回答
0
投票

好吧,经过大量的尝试和错误。数据库列是 DateTime 类型。所以我用这个脚本来改变它:

ALTER TABLE Locations
ADD LastUpdated2 datetimeoffset
GO

UPDATE Locations
SET LastUpdated2 = LastUpdated

ALTER TABLE Locations
DROP COLUMN LastUpdated

我使用 SSMS 手动将 LastUpdated2 重命名为 LastUpdated

然后我将实体模型更改为 DateTimeOffset 类型

public DateTimeOffset? LastUpdated { get; set; }

我的新 URI 过滤器是:

?$filter=IsActive eq true 和 IsAutomated eq true 和 WebSite ne null 和 WebSite ne '' 和 LastUpdated lt 2018-12-30T23:59:59.99Z

© www.soinside.com 2019 - 2024. All rights reserved.