You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoMapper.Extensions.OData比较可空DateTime与DateOnly时生成错误SQL

OData日期过滤引发PostgreSQL整数溢出错误

我的ASP.NET Core Web API所有OData端点返回数据格式如下:

{
    "@odata.context": "...",
    "@odata.count": 0,
    "value": [...]
}

当使用带时间的DateTime过滤器时:

(datetime%20ge%202024-08-21T21%3A00%3A00Z)

生成的行计数SQL为:

SELECT count(*)
FROM table0 AS p
INNER JOIN table1 AS p0 ON p.table1_id = p0.table1_id
WHERE CASE
    WHEN EXISTS (SELECT 1
                 FROM table2_id AS r
                 WHERE p.table0_id = r.table0_id) 
        THEN (SELECT r0.datetime
              FROM table2_id AS r0
              WHERE p.table0_id = r0.table0_id
              LIMIT 1)
    ELSE TIMESTAMPTZ '-infinity'
END >= $3

但如果过滤器仅传入日期(不带时间):

(datetime%20ge%202024-08-21)

生成的SQL会变成:

SELECT COUNT(*) 
FROM table0 
INNER JOIN table1 ON p.table1_id = p0.table1_id 
WHERE DATE_PART('year', CASE WHEN EXISTS ( 
    SELECT * 
    FROM table2 
    WHERE p.table0_id = r.table0_id 
) THEN ( 
    SELECT r0.datetime 
    FROM table2 
    WHERE p.table0_id = r0.table0_id 
    LIMIT 1 
) ELSE TIMESTAMPTZ '-infinity' END AT TIME ZONE 'UTC' ) :: int * 10000 + date_part ( 'month', CASE WHEN EXISTS ( 
    SELECT * 
    FROM table2 
    WHERE p.table0_id = r1.table0_id 
) THEN ( 
    SELECT r2.datetime 
    FROM table2 
    WHERE p.table0_id = r2.table0_id 
    LIMIT 1 
) ELSE TIMESTAMPTZ '-infinity' END AT TIME ZONE 'UTC' ) :: int * 100 + date_part ( 'day', CASE WHEN EXISTS ( 
    SELECT * 
    FROM table2 
    WHERE p.table0_id = r3.table0_id 
) THEN ( 
    SELECT r4.datetime 
    FROM table2 
    WHERE p.table0_id = r4.table0_id 
    LIMIT 1 
) ELSE TIMESTAMPTZ '-infinity' END AT TIME ZONE 'UTC' ) :: int >= @__p_3

当没有匹配记录时,SQL中使用TIMESTAMPTZ '-infinity'会触发转换错误:

PostgresException (0x80004005): 22003: integer out of range

技术栈:

  • .NET 8
  • Microsoft.AspNetCore.OData 8.2.5
  • AutoMapper.AspNetCore.OData.EFCore 5.0.2

内容的提问来源于stack exchange,提问作者Silny ToJa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:45:09