如何优化这个linq查询? (使用OrderBy和ThenBy)

时间:2012-03-28 14:27:19

标签: c# linq optimization

我目前在一张表中有大约90k行。在执行清理并将所有行放入“历史表”之前,它将长大约1kk~5kk。所以,当我运行以下查询时(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秒。有一种方法可以优化第二个查询吗?

2 个答案:

答案 0 :(得分:6)

一些建议:

  • 检查数据库中是否 正在发生(而不是获取所有实体,然后排序)
  • 确保将DayInitialHour编入索引。
  • 检查生成的SQL没有做任何疯狂的事情(查看查询计划)

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

答案 1 :(得分:1)

为了从数据库中读取数据,通常最好创建自定义SQL视图,例如每个网格一个视图和一个要填充的每个表单视图。

在此示例中,您将创建一个视图,为您进行排序,然后将该视图映射到实体框架中的实体,然后使用LINQ查询该实体。

这是一个很好的,干净的,可读的,可维护的,并且是最佳的。

祝你好运!