背景:
最近做项目需要支持动态查询条件(界面上的查询条件不固定,可以自定义配置),为了简化后端代码处理,使用了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语句就可以愉快的执行了。。。