我正在执行此查询
var sourceItems = await this.dbContext.Orders
.AsNoTracking()
.Where(item => item.OrderDate > new DateTime(2019, 1, 1))
.Select(order => new
{
order.CustomerCode
})
.ToListAsync();
我收到了这个 sql 查询
SELECT [o].[CustomerCode]
FROM [Order] AS [o]
WHERE [o].[OrderDate] > '2019-01-01T00:00:00.0000000'
失败了
Core Microsoft SqlClient Data Provider: Conversion failed when converting date and/or time from character string.
我使用的是 EF Core 3.1.5。
如果我直接运行 sql 查询,如果我将日期的毫秒部分中的数字从 6 个零减少到 3 个零或更少,它就会起作用。
如何让 EF Core 甚至跳过日期的毫秒部分?
最佳答案
EF Core 从其他操作数推断常量值的提供程序类型。在本例中,来自 item.OrderDate
。
文字的格式表明 EF Core 采用 datetime2
提供程序类型(DateTime
CLR 类型的默认映射),而异常则表明实际的列类型是日期时间
。
要解决该问题,您必须让 EF Core 了解实际类型,例如将以下内容添加到您的 OnModelCreating
重写中:
modelBuilder.Entity<Order>()
.Property(e => e.OrderDate)
.HasColumnType("datetime");
现在查询将使用正确的 '2019-01-01T00:00:00.000'
文字。
另一个改进是消除文字并让 EF Core 绑定(bind)参数。这是通过将 new DateTime(...)
表达式放入查询表达式树外部的变量中,并在内部使用该变量来实现的:
var afterDate = new DateTime(2019, 1, 1); // <--
var sourceItems = await this.dbContext.Orders
.AsNoTracking()
.Where(item => item.OrderDate > afterDate) // <--
.Select(order => new
{
order.CustomerCode
})
.ToListAsync();
关于entity-framework-core - 与 EF core 中的 DateTime 相比,生成的日期字符串为 6 位小数(以毫秒为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62390778/