Aliyun Tablestore 条件 分页查询

        /// <summary>
        ///根据条件分页查询
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="pageIndex">页码</param>
        /// <returns></returns>
        public static List<ReadAliyunTableLogModel> ReadAliyunTableByQueryPages(string tableName, int   pageSize, int pageIndex)
        {
            OTSClient otsClient = new OTSClient(new OTSClientConfig(m_endpoint, m_id, m_key, m_instanceName));
            int skip = (pageIndex - 1) * pageSize;//需要跳过的条数

            #region 分页读取
            // 读取 (0, INF_MIN)到(100, INF_MAX)这个范围内的所有行,且满足某些条件
            #region Forward 正序
            //PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey
            //{
            //    { "AreaPk", new ColumnValue(0) },
            //    { "Id", ColumnValue.INF_MIN }
            //};

            //PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey
            //{
            //    { "AreaPk", new ColumnValue(100) },
            //    { "Id", ColumnValue.INF_MAX }
            //}; 
            #endregion
            #region Backward 倒序
            PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey
            {
                { "AreaPk", new ColumnValue(0) },
                { "Id", ColumnValue.INF_MIN }
            };

            PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey
            {
                { "AreaPk", new ColumnValue(100) },
                { "Id", ColumnValue.INF_MAX }
            };

            #endregion
            // 构造列过滤条件 
            var condition = new Aliyun.OTS.DataModel.ConditionalUpdate.CompositeCondition(LogicOperator.AND);//表示几个条件需要同时满足
            condition.AddCondition(new Aliyun.OTS.DataModel.ConditionalUpdate.RelationalCondition("列名1", CompareOperator.GREATER_THAN, new ColumnValue("条件1")));
            condition.AddCondition(new Aliyun.OTS.DataModel.ConditionalUpdate.RelationalCondition("列名2", CompareOperator.EQUAL, new ColumnValue("条件2")));

            var queryCriteria = new RangeRowQueryCriteria(tableName)
            {
                Direction = GetRangeDirection.Backward,
                InclusiveStartPrimaryKey = inclusiveStartPrimaryKey,
                ExclusiveEndPrimaryKey = exclusiveEndPrimaryKey,
                Filter = condition.ToFilter(),
                Limit = skip+pageSize
            };

            GetRangeResponse response = otsClient.GetRange(new GetRangeRequest(queryCriteria));
            List<ReadAliyunTableLogModel> aliyunTables = new List<ReadAliyunTableLogModel>();
            PrimaryKey nextStartPrimaryKey = response.NextPrimaryKey;
            while (pageSize>0 && nextStartPrimaryKey != null)
            {
                queryCriteria = new RangeRowQueryCriteria(tableName)
                {
                    //Direction = GetRangeDirection.Forward,//正序读取 起始主键必须小于结束主键
                    Direction = GetRangeDirection.Backward,//逆序读取 起始主键必须大于结束主键
                    InclusiveStartPrimaryKey = nextStartPrimaryKey,
                    ExclusiveEndPrimaryKey = exclusiveEndPrimaryKey,
                    Filter = condition.ToFilter(),
                    Limit = skip+pageSize
                };

                response = otsClient.GetRange(new GetRangeRequest(queryCriteria));
                nextStartPrimaryKey = response.NextPrimaryKey;
                foreach (var row in response.RowDataList)
                {
                    if (skip > 0)
                        skip--; // 对于skip之前的数据,需要过滤掉,采用的策略是读出来后在客户端进行过滤。
                    else
                    {
                        aliyunTables.Add(new ReadAliyunTableLogModel()
                        {

                           //获取某一字段的值
                            ProjectId = (int)row.AttributeColumns["列名"].IntegerValue,
                        });
                        pageSize--;
                    }
                  
                }
            }
            return aliyunTables;
            #endregion
        }

注:使用的Aliyun.TableStore.SDK是4.0版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值