c# - EFCore OrderBy 未按日期字段正确排序
问题描述
我有一个包含日期字段的数据库表中的 146 个项目的列表。在表中它们没有特定的顺序,这要归功于 EF 无法(故意地,据我了解)保证批量插入的顺序。所以我正在使用以下内容提取所有内容:
// Records is a complex object consisting of a bunch of doubles, an integer ID, and a date
// Date is a DateTime, but with a time component of midnight.
var rawData = await Task.Run(() =>_context.Records.OrderBy(item => item.Date).ToList());
奇怪的是当我查看“自动”窗口时会发生什么。以下是最后 12 项的日期:
7/31/2020
8/1/2020
8/2/2020
8/3/2020
8/4/2020
8/5/2020
8/6/2020
8/7/2020
8/8/2020
8/11/2020
2020
年 8 月 10 日 2020 年 8 月 9 日
那是……没有完全排序,尽管这是我输入数据的顺序。
有趣的是,该列表确实显示出被排序的迹象。该表(在 SQLite 中)使用标识列,以下是这 5 个项目的 ID,其顺序与它们在“自动”窗口中出现的顺序相同:
52
46
47
48
49
50
51
71
143
144
145
146
如您所见,由于缺乏更好的措辞,它看起来是半排序的。具体来说,我展示的前 9 个数据点(实际上是到那时为止的所有数据点)都已正确排序。然后我添加了一个数据点(8/11),重新请求数据,它看起来很好。然后我添加了下一个数据点(8/10),重新请求了数据,现在我添加的两个点都未排序。与下一个(8/9)相同。
前 143 个数据点和后三个数据点之间的区别在于,第一个数据点已经在 SQLite 文件中。添加最后三个是为了测试我的应用程序上的添加/编辑功能,因此它们是在应用程序中创建的,并在我的调试会话期间写入文件。
我在这里不知所措。我在这里错过了什么吗?我await
能把事情搞砸吗?还是我需要使用AsNoTracking
只是为了让我的数据以某种方式排序?
解决方案
尝试这个,
var rawData = await context.Records.OrderBy(item => item.Date).ToListAsync();
你的上下文是如何初始化的?
你可以试试
using (var context = serviceProvider.GetService<RecordsContext>())
{
var rawData = await context.Records.OrderBy(item => item.Date).ToListAsync();
}
或者
public class MyController
{
private readonly RecordsContext _context;
public MyController(RecordsContext context)
{
_context = context;
}
public async Task<List<Record>> GetRecords()
{
return await _context.Records.OrderBy(item => item.Date).ToListAsync();
}
}
推荐阅读
- https - 如何在提琴手中解码 websocket 消息?
- azure - 我们如何按自动计划从 Azure 容器注册表 (ACR) 中删除映像?
- java - 使用 Apache POI 和 itext 将 word(.docx) 转换为 pdf
- c++ - 为什么 WinApi typedef 基本数据类型?
- reactjs - react-fontawesome 导入所有图标
- iphone - UITextView 在 DesignView 和 RunTime 中倾斜
- c# - 用于动态小数位数的 MVC ValidationMessage
- angular - Angular PWA 站点的 localhost:8080 返回 / 的索引,而不是 Angular 的默认登录页面?
- javascript - babel 7,IE > 9,webpack 3,ES6 的 IE 语法错误
- winapi - 可以在没有标记的情况下使用 Windows Ribbon Framework 吗?