使用 < DateTime returns EQUAL value in EF Core 6

问题描述 投票:0回答:1

我尝试在 MS SQL Server 会计数据库表中选择两条记录的日期字段。

第一条记录的日期是通过 id 选择的,如下所示:

var lastDate = db.Set<Accounting>().Where(p => p.Id == accountingId).First().AccountDate;

返回该日期的值:

现在我尝试选择此日期之前的会计记录,并提出以下请求:

    var beforeAccounting = db.Set<Accounting>().Where(p => p.AccountDate < lastDate).OrderByDescending(p => p.AccountDate).FirstOrDefault();
    var dateBefore = beforeAccounting?.AccountDate ?? new DateTime(2000, 1, 1);

由于此时数据库中只有一条记录,我希望使用 FirstOrDefault() 得到 NULL,在下一行中将 dateBefore 设置为 01.01.2000。

奇怪的是,该请求从数据库返回同一行。

正如您所看到的,日期字段是完全相同的(还有其他任何内容,因为它是相同的记录)

但是为什么 .Where(p => p.AccountDate < lastDate) ? It is equal, not less isn't it? What am I doing wrong here? Tried the same code in LinqPad where it works like expected? Am I missing something?

返回这条记录
entity-framework-core linq-to-entities
1个回答
0
投票

我玩了一个例子,我认为您的特定场景中缺少更多东西,因为我无法重现该问题。我有一些具有 CreatedAt

DateTime
值的实体,并且做了与您的示例基本相同的操作:

using var context = new SoftDeleteDbContext();
var date = context.Posts.OrderBy(x => x.CreatedAt).Select(x => x.CreatedAt).First();
var test = context.Posts.Where(x => x.CreatedAt < date).OrderByDescending(x=>x.CreatedAt).FirstOrDefault();

我在测试获取时收到 #null 响应。我还尝试了获取加载整个实体的日期:

var date = context.Posts.OrderBy(x => x.CreatedAt).First().CreatedAt;

...以防万一这会有所作为,但事实并非如此。

我还尝试在 CreatedAt 日期时间中添加一个勾号,以防可能出现一些解决问题,但没有什么乐趣。

也许检查 DbContext 配置以确保您没有某种形式的转换或日期时间值之类的转换,或者表中列定义的任何奇怪内容。

© www.soinside.com 2019 - 2024. All rights reserved.