如何优化这个linq查询?(带有OrderBy和ThenBy)
本文关键字:带有 ThenBy 查询 OrderBy 何优化 优化 linq | 更新日期: 2023-09-27 18:29:20
我目前在一个表中有大约90k行。在我执行清理并将所有行放入"历史表"之前,它将增长约1k~5k。因此,当我运行以下查询时(MyEntities是一个ObjectSet):
MyEntities.Skip(amount * page).Take(amount).ToList();
这个查询大约需要1.2秒…但当我用OrderBy和ThenBy运行以下查询时:
MyEntities.OrderBy(b => b.Day).ThenBy(b => b.InitialHour).Skip(amount * page).Take(amount).ToList();
这个查询大约需要5.7秒。有办法优化第二个查询吗?
几个建议:
- 检查它是否真的发生在数据库中(而不是提取所有实体,然后排序)
- 确保对
Day
和InitialHour
都进行了索引 - 检查生成的SQL没有做任何疯狂的事情(检查查询计划)
编辑:好的,看起来MyEntities
实际上被声明为IEnumerable<MyEntity>
,这意味着所有都将在进程中完成。。。所有LINQ调用都将通过Enumerable.Select
等,而不是Queryable.Select
等。只需将声明的类型的MyEntities
更改为IQueryable<MyEntity>
,然后看着它飞起来。。。
对于从数据库中读取数据,通常最好创建自定义SQL视图,例如每个网格一个视图,每个表单一个视图。
在本例中,您将创建一个为自己进行排序的视图,然后将该视图映射到Entity Framework中的实体,然后使用LINQ查询该实体。
这是很好的,干净的,可读的,可维护的,并尽可能优化
祝你好运!