Utilizando Tables do Windows Azure – Versão 2.0

Olá pessoal,

Tempos atrás fiz um post de como utilizar Tables do Windows Azure, que acabou ficando desatualizado devido ao lançamento de uma nova biblioteca para programação, maiores detalhes estão disponíveis aqui. Para o caso específico dos tables, a grande alteração foi o uso de um novo protocolo de comunicação, mais otimizado que o Data Services e é nisso que vou focar nesse post. Em tempo, o modelo de comunicação baseado no DataServices continua funcionando, basta a aplicação utilizar o namespace Microsoft.WindowsAzure.Storage.Table.DataServices.

Como primeiro passo, é necessário adicionar referências para utilizar o storage do Windows Azure na sua aplicação. A maneira mais fácil é utilizando NuGet, basta escolher a opção Manage NuGet Packages… no menu de adicionar referências do seu projeto, conforme imagem abaixo:

image

E pesquisar pelo Windows Azure Storage e escolher a opção Install. Se alguma confirmação for solicitada, basta confirmar a solicitação.

image

Depois de ter as referências instalada, o próximo passo é ter acesso à uma conexão com sua conta de storage, no exemplo abaixo estou utilizando o ambiente de desenvolvimento:

using Microsoft.WindowsAzure.Storage;

CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;

Em seguida, é necessário obter uma referência e criar a tabela se for necessário. Para isso, deve-se obter uma referência para um objeto CloudTableClient e em seguida para o CloudTable, conforme abaixo:

using Microsoft.WindowsAzure.Storage.Table;

CloudTableClient tableClient = account.CreateCloudTableClient();
CloudTable usuarios = tableClient.GetTableReference("Usuarios");
usuarios.CreateIfNotExists();

Recomenda-se que os tipos das entidades armazenadas nas tabelas herdem de TableEntity, que já trata Partition Key, Row Key e Timestamp. O exemplo abaixo traz a definição de Usuário:

using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsAzureTableV2
{
class Usuario : TableEntity
{
public string Nome { get; set; }
public string EMail { get; set; }
public int Idade { get; set; }
public bool AceitaReceberEMails { get; set; }
}
}

Para adicionar um usuário na tabela, além da criação de um objeto do tipo Usuario, é necessário criar uma operação de Insert e depois executá-la:

Usuario usuario = new Usuario()
{
PartitionKey = DateTime.UtcNow.ToString("yyyyMMdd"),
RowKey = Guid.NewGuid().ToString(),
Nome = "Rafael Godinho",
EMail = "rafaelgodinho@contoso.com",
Idade = 30,
AceitaReceberEMails = true
};

//Adicionando usuario
TableOperation insert = TableOperation.Insert(usuario);
usuarios.Execute(insert);

Para atualizar ou excluir o usuário, deve-se utilizar as operações de Replace e Delete:

//Atualizando o usuario
usuario.AceitaReceberEMails = false;
TableOperation update = TableOperation.Replace(usuario);
usuarios.Execute(update);

//Removendo o usuario
TableOperation delete = TableOperation.Delete(usuario);
usuarios.Execute(delete);

Já para pesquisar informações dos usuários, a classe TableQuery deve ser utilizada. O seu método Where é indicado para criação de cláusulas de filtro dos dados:

//Pesquisando usuarios
TableQuery<Usuario> query = new TableQuery<Usuario>().Where(
TableQuery.GenerateFilterCondition(
"PartitionKey",
QueryComparisons.Equal,
DateTime.UtcNow.ToString("yyyyMMdd")));

var queryUsuarios = usuarios.ExecuteQuery<Usuario>(query);

foreach (var item in queryUsuarios)
{
Console.WriteLine(item.Nome);
}

O código inteiro do programa está abaixo:

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsAzureTableV2
{
class Program
{
static void Main(string[] args)
{
CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
CloudTableClient tableClient = account.CreateCloudTableClient();
CloudTable usuarios = tableClient.GetTableReference("Usuarios");
usuarios.CreateIfNotExists();

            Usuario usuario = new Usuario()
{
PartitionKey = DateTime.UtcNow.ToString("yyyyMMdd"),
RowKey = Guid.NewGuid().ToString(),
Nome = "Rafael Godinho",
EMail = "rafaelgodinho@contoso.com",
Idade = 30,
AceitaReceberEMails = true
};

            //Adicionando usuario
TableOperation insert = TableOperation.Insert(usuario);
usuarios.Execute(insert);

            //Atualizando o usuario
usuario.AceitaReceberEMails = false;
TableOperation update = TableOperation.Replace(usuario);
usuarios.Execute(update);

            //Pesquisando usuarios
TableQuery<Usuario> query = new TableQuery<Usuario>().Where(
TableQuery.GenerateFilterCondition(
"PartitionKey",
QueryComparisons.Equal,
DateTime.UtcNow.ToString("yyyyMMdd")));

            var queryUsuarios = usuarios.ExecuteQuery<Usuario>(query);

            foreach (var item in queryUsuarios)
{
Console.WriteLine(item.Nome);
}

            //Removendo o usuario
TableOperation delete = TableOperation.Delete(usuario);
usuarios.Execute(delete);
}
}
}

Já seu código fonte pode ser baixado aqui.

RG