如何优化这个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秒。有办法优化第二个查询吗?

如何优化这个linq查询?(带有OrderBy和ThenBy)

几个建议:

  • 检查它是否真的发生在数据库中(而不是提取所有实体,然后排序)
  • 确保对DayInitialHour都进行了索引
  • 检查生成的SQL没有做任何疯狂的事情(检查查询计划)

编辑:好的,看起来MyEntities实际上被声明为IEnumerable<MyEntity>,这意味着所有都将在进程中完成。。。所有LINQ调用都将通过Enumerable.Select等,而不是Queryable.Select等。只需将声明的类型的MyEntities更改为IQueryable<MyEntity>,然后看着它飞起来。。。

对于从数据库中读取数据,通常最好创建自定义SQL视图,例如每个网格一个视图,每个表单一个视图。

在本例中,您将创建一个为自己进行排序的视图,然后将该视图映射到Entity Framework中的实体,然后使用LINQ查询该实体。

这是很好的,干净的,可读的,可维护的,并尽可能优化

祝你好运!