我尝试在 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?
返回这条记录我玩了一个例子,我认为您的特定场景中缺少更多东西,因为我无法重现该问题。我有一些具有 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 配置以确保您没有某种形式的转换或日期时间值之类的转换,或者表中列定义的任何奇怪内容。