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
相关产品推荐
相关产品推荐

