【问题标题】:Entity Framework order by string in over 10 million rows实体框架在超过 1000 万行中按字符串排序
【发布时间】:2016-06-22 10:13:53
【问题描述】:

我需要对超过 1000 万行文档名称进行排序和过滤(因此我无法修改字符串)。我目前有大约 2 mils 的行,它在 order by 或 where 子句后的 10-15 秒内返回结果。 我更喜欢 EF 解决方案,而不是数据库解决方案,但我愿意接受任何解决方案。 这是一些代码,虽然我不认为它有用:

var orderedQuery = dbItems.OrderBy(a => a.DocumentName);
dbItems = dbItems.Where(a=>
          a.DocumentName.ToLower().Contains(filter.DocumentName.ToLower()));

【问题讨论】:

  • 我对实体框架一无所知,但您是否像上面显示的那样首先按 DocumentName 对数据进行排序,然后过滤到与您的条件相匹配的 DocumentNames?如果是这样,您正在倒退:将数据过滤到较小的集合,然后对较小的集合进行排序。
  • 我可以在不过滤的情况下订购。第一次加载没有过滤器。我正在使用它进行无限滚动。
  • 所以你的第一次加载返回所有 1000 万行,按 DocumentName 排序?这似乎不可取 - 没有人会滚动浏览它,所以他们只会看到名称为“Aardvark 1”的文档。为什么不保留数据,直到您知道他们在寻找什么?
  • 好吧,我不是写业务逻辑的人。我只需要这样做。我知道这很愚蠢,但我问的是怎么做,而不是是否应该做。
  • 您会惊讶于有人想要滚动浏览 1000 万份文档是多么无聊:))

标签: sql oracle entity-framework linq


【解决方案1】:

您应该在第二个查询中使用初始的 orderedQuery,而不是再次查询 dbItems。我还建议将 AsNoTracking 添加到您的第一个 linq 查询中,因为这无疑会显着提高性能

var orderedQuery = dbItems.AsNotracking().OrderBy(a => a.DocumentName);

var filteredList = orderedQuery.Where(a=>
      a.DocumentName.ToLower().Contains(filter.DocumentName.ToLower()));

试试这个,告诉我们进展如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多