【发布时间】:2019-09-18 10:14:12
【问题描述】:
在 .Net 标准 2.0 项目中,我使用 Microsoft.EntityFrameworkCore nuget 版本 2.2.6。我正在动态创建 lambda 表达式,如下所示:
//EntityUtility.ConvertToType() converts string to DateTime type
var constant1 = Expression.Constant(EntityUtility.ConvertToType(minVal, propertyInfo.PropertyType));
var constant2 = Expression.Constant(EntityUtility.ConvertToType(maxVal, propertyInfo.PropertyType));
if (Nullable.GetUnderlyingType(member.Type) != null)
{
member = Expression.Property(member, "Value");
}
var exMin = Expression.GreaterThanOrEqual(member, Expression.Convert(constant1, propertyInfo.PropertyType));
var exMax = Expression.LessThanOrEqual(member, Expression.Convert(constant2, propertyInfo.PropertyType));
operation = Expression.And(exMax, exMin);
查询执行后失败并抛出错误消息Conversion failed when converting date and/or time from character string.。它在 SQL 中转换为错误的日期时间格式。以下是日期时间输入值的转换 SQL 示例:
SELECT [user].[username]
FROM [dbo].[user] AS [user]
WHERE (CASE
WHEN [user].[update_date] <= '2018-03-24T00:00:01.0000000'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END & CASE
WHEN [user].[update_date] >= '2018-03-23T00:00:01.0000000'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END) = 1
go
问题的格式为2018-03-24T00:00:01.0000000。 update_date 是 SQL Server user 表中的 datetime 列。
我该如何解决这个问题?非常感谢任何帮助。
更新:如果格式是2018-03-24T00:00:01.000,它就可以工作。
【问题讨论】:
-
MSSQL Server Mgmt Studio 中的结果以
2018-03-23 11:14:37.000格式返回。 -
您是否告诉 EF Core 列类型是
datetime?例如流利地通过 .HasColumnType("datetime")` 或[Column]属性? -
谢谢@IvanStoev。添加
.HasColumnType("datetime")后它起作用了。有没有其他/简单的方法可以做到这一点?我问这个是因为有 1000 多个表,我必须手动为所有datetime字段添加相同的表。 -
请参阅下面答案中的链接。它适用于
decimal,但可以调整为DateTime。
标签: c# lambda .net-standard-2.0 ef-core-2.2