/// <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版本