C# linq optimization OrderByDescending()



我使用。orderbydescent (x => x.d id)从大型数据集到web应用程序返回页集20中的最新数据。我一直在尝试优化查询的速度,并注意到当我删除orderbydescent()调用时,它将查询时间从大约8或9秒降低到2秒。我假设使用orderbydescent()的查询从第一个条目(最低的ID号)开始,并在返回最后20个左右的结果之前循环遍历所有数据。如果是这样的话,无论如何要使我的查询从最后一个条目(最高的ID号)开始,并工作到最低的方式?

关于我正在使用MS SQL Server和下面的LINQ查询的一些问题,我正在尝试优化

TransactionDao.GetAll()
    .Where(x => x.Order.Location.Id == locationId && x.Status == Status.Complete)
    .OrderByDescending(x => x.Id)
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize).ToList();

我将假设数据源是SQL server,但如果不是,请相应地更新。如果是SQL server,下面是我用来调优LINQ语句的过程。

  1. 使用SQL Management Studio -> Tools -> Profiler启动SQL Profiler
  2. 为简单起见,选择默认选项
  3. 运行应用程序
  4. 在linq语句运行前设置一个断点
  5. 当断点被击中时,切换到分析器并使用橡皮擦清除以前的所有查询。
  6. 运行linq语句
  7. 查找实际执行的SQL语句
  8. 复制到管理工作室
  9. Select Query -> Include实际执行计划
  10. 执行查询并查看执行计划。查看它正在做什么,看看是否有任何索引建议

可选在数据库引擎调优分析器中选择Query -> analyze Query,可以提供额外的索引建议。

我看到很多开发人员做的一件事是在数据层中的选择之前执行and . tolist()或to EntityCollection()。这违背了目的,因为一旦这样做了,就会在数据库上执行查询,并且在内存中执行任何后续的过滤器或顺序。最好让数据层返回IQueryable,以便在数据库上执行筛选。

希望这能给你足够的信息来找到你的问题的答案

我认为这取决于索引,你可以尝试索引你的id和相关列。接下来,您可以尝试通过sql查询执行。或者你可以在查询之前使用list(),这样速度会慢一些。

可以张贴整个Linq查询吗?

从你的问题中,我假设你不使用LingToSql,只是处理从SQL返回的数据。最好的选择当然是只返回最后几行到应用程序中,如果可能的话。

c#中的基本集合没有索引,所以如果你想按顺序从列表中取出最后几行,你必须对所有记录进行排序,否则你不知道哪些是最后的

相关内容

  • 没有找到相关文章

最新更新