EF Core 查询表达式之DateTime的坑

2 篇文章 0 订阅
1 篇文章 0 订阅
本文探讨了在使用Linq动态生成SQL时遇到的DateTime转换问题,通过分析发现是由于查询表达式默认将DateTime转换为DateTime2格式导致。解决方法是在数据库字段上标注实际类型为datetime,确保正确格式的SQL语句生成。
摘要由CSDN通过智能技术生成

背景:

最近做项目需要支持动态查询条件(界面上的查询条件不固定,可以自定义配置),为了简化后端代码处理,使用了Linq查询表达式来动态生成sql语句。

问题:

查询表达式确实好用,但是在处理DateTime类型遇到了以下的错误:从字符串转换日期和/或时间时,转换失败。如下图:

 通过生成出来的sql语句可以看出,日期值自动转换后的毫秒部分有000000(7个0),导致sql语句不能将其识别为有效的日期格式,从而产生了SqlException。

原因推断:

起初以为是前端传入的日期格式问题(通过Swagger接口文档进行测试,默认生成的日期是UTC含时区格式的),在后端接收日期后进行了本地格式化,发现依然报上面的错误。。。

从而可以推断是Linq查询表达式生成SQL语句时进行了日期的转换(默认转换为DateTime2的日期格式),而非前端入参格式错误。既然如此,那肯定是可以在哪里进行配置,来改变这种默认的日期格式转换。

解决办法:

QueryTime字段在数据库表中的类型是datetime,因此我们只需要给该日期属性标记一个在数据库表中的实际类型就好了,如下:

[Column(TypeName = "datetime")]
public DateTime? QueryTime { get; set; }

这样Linq查询表达式生成SQL语句时就会按照指定的数据库字段格式进行日期转换,如下图:

 QueryTime属性的值被转换成了datetime格式(毫秒部分是000(3个0)),这样SQL语句就可以愉快的执行了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值