EFCore多数据库合并查询分页

参照:二个表的数据 如何做分页?_两个表排序分页_深圳市热心市民市民的博客-CSDN博客

基本情况介绍:由于系统迭代,部分收藏表在老系统的数据库,部分在新api接口的数据库,现在有一个需求是在个人中心展示用户收藏的数据,按照收藏时间倒序排列,因为在APP端实际上就算瀑布流分页。

主体思路:通过将两个表通过条件筛选形成IQuerable,再通过Union联结,做的分页,再通过ToList()加载到内存里

query1.Union(query2).Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();

但是经过尝试后,报错:Cannot use multiple DbContext instances within a single query execution。在一个查询里只能使用一个数据库上下文实例。因为来自两个不同的数据库所以query1和query2我们使用了两个不同的 DBContext,配置了不同的数据库连接。结果就出现了上述的报错。转念又想有没有可能在一个负责管理实体对象的上下文中设置多个数据库那不就可以了吗?但是查阅资料,发现并不能实现。因为当存在多个数据库在 DbContext里的 DbSet没办法指定它属于哪个数据库。简而言之,就是一个 DBContext只能对应一个数据库

所以思路调整为从两个 DBContext里查找出结果集(ToList()加载到内存里),再将结果集合并后再做分页,这就涉及到怎么取数据能得到准确的结果还能使得查询效率最大化?假设我们是按照创建时间逆序,每页10条:

这里有一个容易犯错的思路:假设是第一页,先从A表里取10里取5条,再从B表里取5条,合并后再按照时间排序输出。这样做最大的问题是,没办法保证数据的准确性。因为极端一点可能最新的10条数据都来自B表,这样取是没办法保证数据准确性的。

以上错误的做法也给了我们参考意义,那各取多少条就能保证数据是准确的呢?答案是 pageNumber*pageSize为什么呢?以第一页为例,假设每页10条,我从A表里取10条,再从B表里取10条,从合并后的20条里找出最新的10条,这是肯定合理的,它能涵盖这页数据全部来自其中一张表的情况。以此类推,第二页:各取20条;第三页:各取30条...以此类推。很容易发现问题,就是约到后面的页码,我们要取得数据越多。基本上是线性增加的,那就意味着到了后面的页码会出现我们之前不愿见到的局面:我们把大量的结果集都加载到了内存里,再进行合并排序分页。

参照的文章给了我们思路。因为我们分页基本上是在排序后进行的,所以我们每次分页的最后一条数据,可以作为下一页数据的的筛选判断条件。以我们文中例子,第一页第10条数据的创建时间一定是大于第二页的数据的。我们就可以在调用接口时除了我们的页码参数,把前一页码数据最后一条的创建时间也带上当作参数传入。结果是

var result1 = dbContext1.Colections.where(s=>s.CreateTime< timeParm).OrderByDescending(s=>s.CreateTime).Take(pageSize).ToList();
var result2 =dbContext2.Colections.where(s=>s.CreateTime< timeParm).OrderByDescending(s=>s.CreateTime).Take(pageSize).ToList();

仅仅只需要每次各从结果集取出pageSize条,甚至不需要pageNum的参数就能实现我们需要的效果。另外它还有个隐藏性能福利:我们通过where的筛选实现了 Skip((pageNumber - 1) * pageSize)的效果,性能会更高。每次取出加载到内存的结果集都很小,实现了我们预期的效果。

EFCore多数据库合并查询分页的更多相关文章

  1. oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by

    select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...

  2. .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...

  3. 基于Mysql数据库的SSM分页查询

    前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给 ...

  4. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  5. TODO:数据库优化之分页

    TODO:数据库优化之分页 本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返 ...

  6. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. SQL多表合并查询结果

    两表合并查询,并同时展示及分页SELECT a.* FROM ( ( SELECT punycode, `domain`, 'Success' AS state, add_time, AS refun ...

  8. Oracle数据库的SQL分页模板

    在系统开发过程中,需要对数据进行查询,大部分情况下从数据库中查询的数据量比较大,在系统页面无法全部显示,而且查询全部的数据会影响系统的反应速度,需要对所查询的数据进行分页的查询操作,以此减轻系统的压力 ...

  9. mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写

    sqlyog设置一直习惯用sqlyog来管理mysql数据库,但有三个地方用得不是很爽:1.默认查询条数只有1000条经常需要勾选掉重新查询.2.自动替换关键字大小写,有时候字段名为关键字的搞成大写的 ...

  10. [R语言]foreach和doParallel包实现多个数据库同时查询

    R语言在进行数据库查询时,每执行一条语句,都会阻塞.直到查询语句返回结果之后,才会进行下一条语句. 为了能够实现同时对多个数据库进行查询,以节省顺序执行下来的时间,首先考虑通过多线程来进行数据库查询. ...

随机推荐

  1. AI时代云动力:新一代弹性计算云主机开启智能计算新纪元!

    随着信息技术的飞速发展,云计算在企业数字化转型中发挥着愈发重要的作用. 弹性计算作为云计算技术的重要组成部分,以灵活的资源分配.高可用性等优势,在数字化转型中扮演着举足轻重的角色. 为打造更加卓越的上 ...

  2. Centos7搭建mailx邮件应用

    邮件发送原理图 邮件用户代理(MUA,Mail User Agent)邮件传送代理(MTA,Mail Transport Agent)邮件分发代理(MDA,Mail Deliver Agent) 邮件 ...

  3. THUWC 之后到 2.9 的总结

    考试 题解还没来得及写. 还是出现没有得到预期得分的情况,有时是没有调试完成,有时是挂分. 但是从做题情况看来,做我熟悉的题目比方说偏数学和性质的一般没有劣势.但是在数据结构比较不熟练,技巧和 tri ...

  4. linux mint安装Idea

    一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 记住 ...

  5. FreeSql学习笔记——1.入门

    前言 学习过程中,使用的是.Net 5 WebApi项目,数据库使用的是SQL Server,主要会整理下常用的api,现在就开始吧~   初始化 先选择一个WebCoreApi项目进行创建,创建完项 ...

  6. NOI春季测试游记

    Day -20 本来以为不能报名,但听说初中生可以报名,遂报名. Day -20~-2 刷一些题,并学了大量新知识如DP. Day n(-15≤n≤-5) 在公众号的名单上看到我的名字. 同校还有人参 ...

  7. 解密prompt系列48. DeepSeek R1 & Kimi 1.5长思维链 - RL Scaling

    春节前DeepSeek R1和Kimi1.5炸翻天了,之前大家推测的O1的实现路径,多数都集中在MCTS推理优化,以及STaR等样本自优化方案等等,结果DeepSeek和Kiim直接出手揭示了reas ...

  8. 程序员的生产力神器Cursor -新手实操指南

    不得不说这个Cursor AI简直是神器中的神器! 代码自动补全就算了,关键是它能直接读懂我的意图,秒懂需求!为你自动生成整个项目级别的代码!开发过程丝滑得像在跟老朋友聊天,代码质量贼高,效率提升10 ...

  9. -bash: ./run.sh: /bin/bash^M: bad interpreter: No such file or directory 报错解决方法

  10. Java 加密和解密

    在 Java 中,加密和解密通常通过 Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 实现.以下是常见 ...