过滤、合并、排序和分页来自多个来源的数据

Ale*_*scu 5 c# merge pagination caching iqueryable

目前,我正在通过一种方法从数据库检索数据,该方法检索IQueryable<T1>、过滤、排序,然后对其进行分页(基本上所有这些都在数据库上),然后将结果返回到 UI 以在分页表中显示。

我需要集成另一个数据库的结果,分页似乎是主要问题。

  • 模型相似但不相同(相同的字段,不同的名称,在返回之前需要映射到通用域模型);
  • 无法在数据库级别加入;
  • 目前两个数据库之间大约有 1000 条记录(在过去 18 个月内添加),并且可能以基本相同(缓慢)的速度增长;
  • 结果始终需要按 1-2 个字段(按日期)排序。

我目前在这两种解决方案之间左右为难:

  1. 从两个来源检索所有数据,合并、排序然后缓存它们;然后在接收请求时简单地对所述缓存进行过滤和分页 - 但我需要在修改集合时使缓存失效(我可以);
  2. 过滤每个源上的数据(同样是在数据库级别),然后在返回之前检索、合并、排序和分页。

我正在寻找一种性能良好的算法。理想的解决方案可能是它们之间的组合(在数据库级别缓存+过滤),但我目前还没有考虑这一点。

Evk*_*Evk 4

我认为你可以使用以下算法。假设您的页面大小为 10,则对于页面 0:

  1. 从数据库 A 获取 10 个结果,在数据库级别进行过滤和排序。
  2. 从数据库B获取10条结果,在db级别进行过滤和排序(与上面的查询并行)
  3. 合并这两个结果即可得到按正确排序顺序的 10 条记录。因此,您已排序 20 条记录,但只取出其中的前 10 条并显示在 UI 中

然后对于第 1 页:

  1. 请注意在上一步中您在 UI 中显示了数据库 A 和 B 中的多少项。例如,您使用了数据库 A 中的 2 个项目和数据库 B 中的 8 个项目。
  2. 从数据库 A 获取 10 个结果,进行过滤和排序,但从位置 2 开始(跳过 2),因为这两个结果已在 UI 中显示。
  3. 从数据库 B 获取 10 个结果,经过过滤和排序,但从位置 8 开始(跳过 8)。
  4. 以与上面相同的方式合并,从 20 条记录中获取 10 条记录。假设现在您使用了 A 中的 5 个项目和 B 中的 5 个项目。现在,您总共显示了 A 中的 7 个项目和 B 中的 13 个项目。使用这些数字作为下一步。

这不允许(轻松)跳过页面,但据我了解,这不是必需的。

性能实际上应该与查询单个数据库时相同,因为对 A 和 B 的查询可以并行完成。