【问题标题】:Indexes for LINQ queriesLINQ 查询的索引
【发布时间】:2012-08-16 11:01:42
【问题描述】:

请告知是否有一种标准方法可以更快地进行此类查询

var res = qlist.Where(o => o.left >= x && o.right >= x).ToList()

qlist 对象可以包含多达一百万个元素,这样的查询可能非常慢。是否有 linq 或类似的索引?

谢谢

更新: 抱歉无法在 cmets 中回答。 它是linq-to-objects,目的是缓存DB。

【问题讨论】:

  • 为什么你必须在内存中存储百万元素,这不是合适的解决方案,索引应该在数据库中吗?
  • 这是 Linq-to-objects 吗?或者像 Linq2Sql 这样的任何其他上下文?

标签: .net linq where indexing


【解决方案1】:

虽然针对数据库执行的 LINQ2SQL 查询享有可能在数据库中定义的索引,但内存中执行的 LINQ 查询没有索引。

不幸的是,您需要自己滚动:对列表进行排序,使用 List.BinarySearch 获取初始位置和最后位置,然后使用 LINQ 获取中间的所有条目。

【讨论】:

  • 感谢您的回答。我正在尝试缓存数据库数据。 List.BinarySearch 将无济于事。可能我需要编写自己的 R-tree 索引
【解决方案2】:

除了告诉您为此使用数据库(如前所述)之外,您还可以通过两种方式提高性能:

  1. 使用 AsParallel:

    var res = qlist.AsParallel().Where(o => o.left >= x && o.right >= x).ToList();

  2. 您可以将项目插入到两个不同的排序列表中,一个是left,另一个是right。对于给定的 x,通过二分搜索找到等于(或几乎等于)它的项目,并从两个列表中获取该项目之后的所有项目。最终结果应该是从两个列表中选择的项目。不知道是不是更有效率。这取决于您插入了多少次以及您会找到多少项。

【讨论】:

  • 感谢您的回答。我正在尝试缓存数据库数据。 List.BinarySearch 将无济于事。可能我需要编写自己的 R-tree 索引
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多