entity-framework-core - 与 EF core 中的 DateTime 相比,生成的日期字符串为 6 位小数(以毫秒为单位)

标签 entity-framework-core ef-core-3.1

我正在执行此查询

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/

相关文章:

c# - 领域模型及相关数据(贫血领域模型)

entity-framework - 使用 EF Core 3.1 将 SQL 查询挂载到 EXTRACT postgresql 函数

c# - EF Core 3 DbQuery等效功能

c# - 结合 join 和 group by 时,EF Core 3.1 意外生成 SQL

entity-framework - SQL 超时已过期。操作完成前超时时间已过或服务器未响应

asp.net - 如何在 Entity Framework Core 2.1 中播种枚举

sql-server - 如何从 SQL Server 2016 生产机器恢复 EF Core 迁移

c# - 此平台不支持 Microsoft.Data.SqlClient - Entity Framework Core 3.1

c# - Entity Framework 核心 3.1.7 : failure during Update of record

entity-framework - 如何使用 EF 3.1 为 Entity Framework GroupBy 中的每个组选择前 N 行