C#跨库查询-分页

demo

条件:两个数据库的数据不能重复

 

try
            {

                int warehouseId = request.Model.WarehouseID;
                using (var dbSession = dbConnection.GetConnection(warehouseId))
                {

                    string clickHouseDatabase = dbSession.Connection.Database;//clickhouse数据库名称
                    long totalCount = 0;
                    long needCount = 0;
                    List<MemberInventoryInDetailPO> memberInventoryInDetailPOs = new List<MemberInventoryInDetailPO>();

                    var memberInventoryInMapper = dbSession.GetMapper<MemberInventoryInDetailDataAccess>();//映射DAl 对象                  
                    var memberInventoryInDetailPOsMysql = memberInventoryInMapper.InDetailQuery(request.Model, out totalCount).ToList(); //获取客户入库明细

                    //获取客户出库库存-clickhouse数据库
                    var result = new ClickHouseDataDataAccess();
                    var clickhouseDataCount = result.MemberInCountQuery(request.Model, clickHouseDatabase);//查询clickhouse数据库总数
                    long allCount = totalCount + clickhouseDataCount;//mysql数据总数加clickhouse数据总数

                    if (totalCount % request.Model.PageSize != 0)
                    {
                        needCount = request.Model.PageSize - totalCount % request.Model.PageSize;//若不足需要从clickhouse中取的所需数
                    }
                    //判断当前页获取数据
                    if (request.Model.PageCurrent > (totalCount - 1) / request.Model.PageSize + 1 || totalCount == 0)
                    {
                        if (totalCount != 0)
                        {
                            request.Model.PageCurrent = request.Model.PageCurrent - (((int)totalCount - 1) / request.Model.PageSize + 1);//clickhouse当前页=当前页-mysql总页数
                        }
                        memberInventoryInDetailPOs = result.MemberInQuery(request.Model, clickHouseDatabase, needCount, 1);//查询clickhouse数据
                    }
                    else
                    {
                        if (request.Model.PageCurrent == (totalCount - 1) / request.Model.PageSize + 1 && totalCount % request.Model.PageSize != 0)//当前页等于mysql总页数并且mysql求取总页数时有余数
                        {
                            var memberInventoryInDetailPOsNeed = result.MemberInQuery(request.Model, clickHouseDatabase, needCount, 2);//查询clickhouse数据
                            memberInventoryInDetailPOs = memberInventoryInDetailPOsMysql.Union(memberInventoryInDetailPOsNeed).ToList();//合并mysql与所需clickhouse数据
                        }
                        else
                        {
                            memberInventoryInDetailPOs = memberInventoryInDetailPOsMysql;
                        }
                    }

                    ResponseQueryMsgModel responseQueryMsgModel = new ResponseQueryMsgModel
                    {
                        flag = true,
                        total = (int)allCount,
                        rows = memberInventoryInDetailPOs
                    };
                    return responseQueryMsgModel;
                }
            }
            catch (Exception e)
            {
                logger.LogError("执行失败," + e.Message + e.StackTrace);
                return new ResponseQueryMsgModel
                {
                    flag = false,
                    total = 0
                };
            }

 

上一篇:分页后筛选处理过的数据,再重新进行分页封装


下一篇:bootstrap table 前端分页(client)和服务端分页(server)的配置项差别