Use filtros no Tablestore para refinar resultados de consulta no servidor com base em condições específicas. Este tópico descreve como usar filtros no SDK para .NET.
Pré-requisitos
Tipos de filtro
O Tablestore oferece dois tipos de filtros:
RelationalCondition: Verifica se o valor de uma única coluna de atributo atende a uma condição especificada.
CompositeCondition: Combina várias condições para filtrar dados.
RelationalCondition
public class RelationalCondition : IColumnCondition
Exemplo
Este exemplo executa uma consulta de intervalo para linhas cuja chave primária está no intervalo [row1, row3). Em seguida, aplica um filtro para retornar apenas as linhas em que a coluna de atributo col1 seja igual a val1.
try
{
// Set the start primary key for the query.
PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey()
{
{ "id", new ColumnValue("row1") }
};
// Set the end primary key for the query. The end key is exclusive.
PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey()
{
{ "id", new ColumnValue("row3") }
};
// Create a filter with the condition: col1 == "val1".
RelationalCondition relationalCondition = new RelationalCondition("col1", CompareOperator.EQUAL, new ColumnValue("val1"));
// Call the GetRange method to read row data.
GetRangeRequest getRangeRequest = new GetRangeRequest("test_table", GetRangeDirection.Forward, inclusiveStartPrimaryKey, exclusiveEndPrimaryKey, null, null, relationalCondition);
GetRangeResponse getRangeResponse = client.GetRange(getRangeRequest);
// Process the response.
Console.WriteLine($"RequestId: {getRangeResponse.RequestID}");
Console.WriteLine($"Read CU Cost: {getRangeResponse.ConsumedCapacityUnit.Read}");
Console.WriteLine($"Write CU Cost: {getRangeResponse.ConsumedCapacityUnit.Write}");
Console.WriteLine("Row Data: ");
foreach (Row row in getRangeResponse.RowDataList)
{
Console.WriteLine(row);
}
}
catch (Exception ex)
{
Console.WriteLine($"Get Range failed, exception: {ex.Message}");
}
-
Para excluir linhas sem a coluna de atributo especificada, defina
PassIfMissingcomofalse.relationalCondition.PassIfMissing = false;
CompositeCondition
É possível combinar até 32 condições.
public class CompositeCondition : IColumnCondition
Exemplo
O exemplo abaixo demonstra uma consulta de intervalo para linhas com chave primária no intervalo [row1, row3), usando um CompositeCondition para filtrar os resultados.
try
{
// Set the start primary key for the query.
PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey()
{
{ "id", new ColumnValue("row1") }
};
// Set the end primary key for the query. The end key is exclusive.
PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey()
{
{ "id", new ColumnValue("row3") }
};
// Create RelationalCondition 1: col1 == "val1".
RelationalCondition relationalCondition1 = new RelationalCondition("col1", CompareOperator.EQUAL, new ColumnValue("val1"));
// Create RelationalCondition 2: col2 == "val2".
RelationalCondition relationalCondition2 = new RelationalCondition("col2", CompareOperator.EQUAL, new ColumnValue("val2"));
// Create CompositeCondition 1: col1 == "val1" OR col2 == "val2".
CompositeCondition compositeCondition1 = new CompositeCondition(LogicOperator.OR);
compositeCondition1.AddCondition(relationalCondition1);
compositeCondition1.AddCondition(relationalCondition2);
// Create RelationalCondition 3: col3 == "val3".
RelationalCondition relationalCondition3 = new RelationalCondition("col3", CompareOperator.EQUAL, new ColumnValue("val3"));
// Create CompositeCondition 2, which combines the previous conditions: (col1 == "val1" OR col2 == "val2") AND col3 == "val3".
CompositeCondition compositeCondition2 = new CompositeCondition(LogicOperator.AND);
compositeCondition2.AddCondition(compositeCondition1);
compositeCondition2.AddCondition(relationalCondition3);
// Call the GetRange method to read row data.
GetRangeRequest getRangeRequest = new GetRangeRequest("test_table", GetRangeDirection.Forward, inclusiveStartPrimaryKey, exclusiveEndPrimaryKey, null, null, compositeCondition2);
GetRangeResponse getRangeResponse = client.GetRange(getRangeRequest);
// Process the response.
Console.WriteLine($"RequestId: {getRangeResponse.RequestID}");
Console.WriteLine($"Read CU Cost: {getRangeResponse.ConsumedCapacityUnit.Read}");
Console.WriteLine($"Write CU Cost: {getRangeResponse.ConsumedCapacityUnit.Write}");
Console.WriteLine("Row Data: ");
foreach (Row row in getRangeResponse.RowDataList)
{
Console.WriteLine(row);
}
}
catch (Exception ex)
{
Console.WriteLine($"Get Range failed, exception: {ex.Message}");
}