Método Table.Query no AWS SDK for .NET - Amazon DynamoDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Método Table.Query no AWS SDK for .NET

O método Query permite que você consulte suas tabelas. Apenas é possível consultar tabelas que tenham uma chave primária composta (chave de partição e chave de classificação). Se a chave primária da sua tabela for composta por apenas uma chave de partição, a operação Query não terá suporte. Por padrão, Query realiza internamente consultas que são eventualmente consistentes. Para saber mais sobre o modelo de consistência, consulte Consistência de leituras.

O método Query fornece duas sobrecargas. Os parâmetros mínimos necessários para o método Query são um valor de chave de partição e um filtro de chave de classificação. É possível usar a seguinte sobrecarga para fornecer esses parâmetros mínimos necessários.

exemplo
Query(Primitive partitionKey, RangeFilter Filter);

Por exemplo, o código C# a seguir consulta todas as respostas de fórum que foram publicadas nos últimos 15 dias.

exemplo
string tableName = "Reply"; Table table = Table.LoadTable(client, tableName); DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); RangeFilter filter = new RangeFilter(QueryOperator.GreaterThan, twoWeeksAgoDate); Search search = table.Query("DynamoDB Thread 2", filter);

Isso cria um objeto Search. Agora, é possível chamar o método Search.GetNextSet iterativamente para recuperar uma página de resultados por vez, conforme mostrado no exemplo de código C# a seguir. O código imprime os valores de atributo para cada item que a consulta retorna.

exemplo
List<Document> documentSet = new List<Document>(); do { documentSet = search.GetNextSet(); foreach (var document in documentSet) PrintDocument(document); } while (!search.IsDone); private static void PrintDocument(Document document) { Console.WriteLine(); foreach (var attribute in document.GetAttributeNames()) { string stringValue = null; var value = document[attribute]; if (value is Primitive) stringValue = value.AsPrimitive().Value; else if (value is PrimitiveList) stringValue = string.Join(",", (from primitive in value.AsPrimitiveList().Entries select primitive.Value).ToArray()); Console.WriteLine("{0} - {1}", attribute, stringValue); } }

Especificar parâmetros opcionais

Também é possível especificar os parâmetros opcionais de Query, como especificar uma lista de atributos a serem recuperados, leituras fortemente consistentes, tamanho das páginas e o número de itens retornados por página. Para obter uma lista completa de parâmetros, consulte Query. Para especificar parâmetros opcionais, você deve usar a seguinte sobrecarga, na qual você fornece o objeto QueryOperationConfig.

exemplo
Query(QueryOperationConfig config);

Suponha que você queira executar a consulta no exemplo anterior (recuperar respostas de fórum postadas nos últimos 15 dias). No entanto, suponha que você queira fornecer parâmetros de consulta opcionais para recuperar apenas atributos específicos e também solicitar uma leitura fortemente consistente. O exemplo de código C# a seguir cria a solicitação usando o objeto QueryOperationConfig.

exemplo
Table table = Table.LoadTable(client, "Reply"); DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); QueryOperationConfig config = new QueryOperationConfig() { HashKey = "DynamoDB Thread 2", //Partition key AttributesToGet = new List<string> { "Subject", "ReplyDateTime", "PostedBy" }, ConsistentRead = true, Filter = new RangeFilter(QueryOperator.GreaterThan, twoWeeksAgoDate) }; Search search = table.Query(config);

Exemplo: consulta usando o método Table.Query

O exemplo de código C# a seguir usa o método Table.Query para executar as seguintes consultas de exemplo.

  • As consultas a seguir são executadas na tabela Reply.

    • Localizar respostas de tópicos de fórum que foram postadas nos últimos 15 dias.

      Essa consulta é executada duas vezes. Na primeira chamada de Table.Query, o exemplo fornece somente os parâmetros de consulta necessários. Na segunda chamada de Table.Query, forneça parâmetros de consulta opcionais para solicitar uma leitura fortemente consistente e uma lista de atributos para recuperar.

    • Localizar respostas de tópicos de fórum postadas durante um certo período.

      Essa consulta usa o operador de consulta Between para localizar respostas publicadas entre duas datas.

  • Obtenha um produto da tabela ProductCatalog.

    Como a tabela ProductCatalog tem uma chave primária que é somente uma chave de partição, só é possível obter itens, mas não consultar a tabela. O exemplo recupera um item de produto específico usando o Id do item.

exemplo
using System; using System.Collections.Generic; using System.Linq; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DocumentModel; using Amazon.Runtime; using Amazon.SecurityToken; namespace com.amazonaws.codesamples { class MidLevelQueryAndScan { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); static void Main(string[] args) { try { // Query examples. Table replyTable = Table.LoadTable(client, "Reply"); string forumName = "Amazon DynamoDB"; string threadSubject = "DynamoDB Thread 2"; FindRepliesInLast15Days(replyTable, forumName, threadSubject); FindRepliesInLast15DaysWithConfig(replyTable, forumName, threadSubject); FindRepliesPostedWithinTimePeriod(replyTable, forumName, threadSubject); // Get Example. Table productCatalogTable = Table.LoadTable(client, "ProductCatalog"); int productId = 101; GetProduct(productCatalogTable, productId); Console.WriteLine("To continue, press Enter"); Console.ReadLine(); } catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } } private static void GetProduct(Table tableName, int productId) { Console.WriteLine("*** Executing GetProduct() ***"); Document productDocument = tableName.GetItem(productId); if (productDocument != null) { PrintDocument(productDocument); } else { Console.WriteLine("Error: product " + productId + " does not exist"); } } private static void FindRepliesInLast15Days(Table table, string forumName, string threadSubject) { string Attribute = forumName + "#" + threadSubject; DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, partitionKey); filter.AddCondition("ReplyDateTime", QueryOperator.GreaterThan, twoWeeksAgoDate); // Use Query overloads that takes the minimum required query parameters. Search search = table.Query(filter); List<Document> documentSet = new List<Document>(); do { documentSet = search.GetNextSet(); Console.WriteLine("\nFindRepliesInLast15Days: printing ............"); foreach (var document in documentSet) PrintDocument(document); } while (!search.IsDone); } private static void FindRepliesPostedWithinTimePeriod(Table table, string forumName, string threadSubject) { DateTime startDate = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0)); DateTime endDate = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0)); QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, forumName + "#" + threadSubject); filter.AddCondition("ReplyDateTime", QueryOperator.Between, startDate, endDate); QueryOperationConfig config = new QueryOperationConfig() { Limit = 2, // 2 items/page. Select = SelectValues.SpecificAttributes, AttributesToGet = new List<string> { "Message", "ReplyDateTime", "PostedBy" }, ConsistentRead = true, Filter = filter }; Search search = table.Query(config); List<Document> documentList = new List<Document>(); do { documentList = search.GetNextSet(); Console.WriteLine("\nFindRepliesPostedWithinTimePeriod: printing replies posted within dates: {0} and {1} ............", startDate, endDate); foreach (var document in documentList) { PrintDocument(document); } } while (!search.IsDone); } private static void FindRepliesInLast15DaysWithConfig(Table table, string forumName, string threadName) { DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); QueryFilter filter = new QueryFilter("Id", QueryOperator.Equal, forumName + "#" + threadName); filter.AddCondition("ReplyDateTime", QueryOperator.GreaterThan, twoWeeksAgoDate); // You are specifying optional parameters so use QueryOperationConfig. QueryOperationConfig config = new QueryOperationConfig() { Filter = filter, // Optional parameters. Select = SelectValues.SpecificAttributes, AttributesToGet = new List<string> { "Message", "ReplyDateTime", "PostedBy" }, ConsistentRead = true }; Search search = table.Query(config); List<Document> documentSet = new List<Document>(); do { documentSet = search.GetNextSet(); Console.WriteLine("\nFindRepliesInLast15DaysWithConfig: printing ............"); foreach (var document in documentSet) PrintDocument(document); } while (!search.IsDone); } private static void PrintDocument(Document document) { // count++; Console.WriteLine(); foreach (var attribute in document.GetAttributeNames()) { string stringValue = null; var value = document[attribute]; if (value is Primitive) stringValue = value.AsPrimitive().Value.ToString(); else if (value is PrimitiveList) stringValue = string.Join(",", (from primitive in value.AsPrimitiveList().Entries select primitive.Value).ToArray()); Console.WriteLine("{0} - {1}", attribute, stringValue); } } } }