Ejemplo: consultas y análisis en DynamoDB con el modelo de persistencia de objetos de AWS SDK for .NET - Amazon DynamoDB

Ejemplo: consultas y análisis en DynamoDB con el modelo de persistencia de objetos de AWS SDK for .NET

En el ejemplo de C# de esta sección se definen las clases siguientes y se mapean a las tablas de DynamoDB. Para obtener más información sobre cómo crear las tablas que se utilizan en este ejemplo, consulte Creación de tablas y carga de datos para ejemplos de código en DynamoDB.

  • La clase Book se mapea a la tabla ProductCatalog.

  • Las clases Forum, Thread y Reply se mapean a las tablas del mismo nombre.

A continuación, en el ejemplo se usa DynamoDBContext para ejecutar las siguientes operaciones de consulta y análisis.

  • Obtenga un libro por Id.

    La tabla ProductCatalog tiene Id como clave principal. No tiene una clave de ordenación que forme parte de la clave principal. Por lo tanto, no puede consultar la tabla. Puede usar el valor de Id para obtener un elemento.

  • Ejecute las siguientes consultas en la tabla Reply. (La clave principal Reply de la tabla esta compuesta de los atributos Id y ReplyDateTime. La ReplyDateTimees una clave de ordenación. Por lo tanto, puede consultar esta tabla).

    • Buscar las respuestas a una conversación del foro publicadas en los últimos 15 días.

    • Buscar las respuestas a una conversación del foro publicadas en un intervalo de tiempo determinado.

  • Examinar la tabla ProductCatalog para buscar los libros cuyo precio sea menor que cero.

    Por motivos de rendimiento, debe usar una consulta y no una operación de examen. Sin embargo, a veces puede que necesite examinar una tabla. Supongamos que se ha cometido un error al especificar los datos y que el precio de uno de los libros se ha establecido en un valor menor que 0. En este ejemplo se analiza la tabla ProductCategory para buscar los elementos de libro (ProductCategory es el libro) cuyo precio sea menor que 0.

Para obtener instrucciones sobre la creación y comprobación de una muestra funcional, consulte Ejemplos de código .NET.

nota

El siguiente ejemplo no funciona con .NET core, ya que no es compatible con los métodos sincrónicos. Para obtener más información, consulte API asincrónicas de AWS para .NET.

ejemplo
using System; using System.Collections.Generic; using System.Configuration; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; using Amazon.DynamoDBv2.DocumentModel; using Amazon.Runtime; namespace com.amazonaws.codesamples { class HighLevelQueryAndScan { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); static void Main(string[] args) { try { DynamoDBContext context = new DynamoDBContext(client); // Get an item. GetBook(context, 101); // Sample forum and thread to test queries. string forumName = "Amazon DynamoDB"; string threadSubject = "DynamoDB Thread 1"; // Sample queries. FindRepliesInLast15Days(context, forumName, threadSubject); FindRepliesPostedWithinTimePeriod(context, forumName, threadSubject); // Scan table. FindProductsPricedLessThanZero(context); 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 GetBook(DynamoDBContext context, int productId) { Book bookItem = context.Load<Book>(productId); Console.WriteLine("\nGetBook: Printing result....."); Console.WriteLine("Title: {0} \n No.Of threads:{1} \n No. of messages: {2}", bookItem.Title, bookItem.ISBN, bookItem.PageCount); } private static void FindRepliesInLast15Days(DynamoDBContext context, string forumName, string threadSubject) { string replyId = forumName + "#" + threadSubject; DateTime twoWeeksAgoDate = DateTime.UtcNow - TimeSpan.FromDays(15); IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate); Console.WriteLine("\nFindRepliesInLast15Days: Printing result....."); foreach (Reply r in latestReplies) Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.PostedBy, r.Message, r.ReplyDateTime); } private static void FindRepliesPostedWithinTimePeriod(DynamoDBContext context, string forumName, string threadSubject) { string forumId = forumName + "#" + threadSubject; Console.WriteLine("\nFindRepliesPostedWithinTimePeriod: Printing result....."); DateTime startDate = DateTime.UtcNow - TimeSpan.FromDays(30); DateTime endDate = DateTime.UtcNow - TimeSpan.FromDays(1); IEnumerable<Reply> repliesInAPeriod = context.Query<Reply>(forumId, QueryOperator.Between, startDate, endDate); foreach (Reply r in repliesInAPeriod) Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.PostedBy, r.Message, r.ReplyDateTime); } private static void FindProductsPricedLessThanZero(DynamoDBContext context) { int price = 0; IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>( new ScanCondition("Price", ScanOperator.LessThan, price), new ScanCondition("ProductCategory", ScanOperator.Equal, "Book") ); Console.WriteLine("\nFindProductsPricedLessThanZero: Printing result....."); foreach (Book r in itemsWithWrongPrice) Console.WriteLine("{0}\t{1}\t{2}\t{3}", r.Id, r.Title, r.Price, r.ISBN); } } [DynamoDBTable("Reply")] public class Reply { [DynamoDBHashKey] //Partition key public string Id { get; set; } [DynamoDBRangeKey] //Sort key public DateTime ReplyDateTime { get; set; } // Properties included implicitly. public string Message { get; set; } // Explicit property mapping with object persistence model attributes. [DynamoDBProperty("LastPostedBy")] public string PostedBy { get; set; } // Property to store version number for optimistic locking. [DynamoDBVersion] public int? Version { get; set; } } [DynamoDBTable("Thread")] public class Thread { // Partition key mapping. [DynamoDBHashKey] //Partition key public string ForumName { get; set; } [DynamoDBRangeKey] //Sort key public DateTime Subject { get; set; } // Implicit mapping. public string Message { get; set; } public string LastPostedBy { get; set; } public int Views { get; set; } public int Replies { get; set; } public bool Answered { get; set; } public DateTime LastPostedDateTime { get; set; } // Explicit mapping (property and table attribute names are different). [DynamoDBProperty("Tags")] public List<string> KeywordTags { get; set; } // Property to store version number for optimistic locking. [DynamoDBVersion] public int? Version { get; set; } } [DynamoDBTable("Forum")] public class Forum { [DynamoDBHashKey] public string Name { get; set; } // All the following properties are explicitly mapped // to show how to provide mapping. [DynamoDBProperty] public int Threads { get; set; } [DynamoDBProperty] public int Views { get; set; } [DynamoDBProperty] public string LastPostBy { get; set; } [DynamoDBProperty] public DateTime LastPostDateTime { get; set; } [DynamoDBProperty] public int Messages { get; set; } } [DynamoDBTable("ProductCatalog")] public class Book { [DynamoDBHashKey] //Partition key public int Id { get; set; } public string Title { get; set; } public string ISBN { get; set; } public int Price { get; set; } public string PageCount { get; set; } public string ProductCategory { get; set; } public bool InPublication { get; set; } } }