Integrando MongoDB com .Net e LINQ

Olá!

Na última sexta-feira (13 de Julho de 2012), estive presente no MongoDB São Paulo 2012. Um evento organizado pela 10Gen sobre o uso do MongoDB. Para quem não sabe o MongoDB é um banco de dados No-SQL, isto é, não trabalha com o paradigma relacional, não trabalha com colunas e nem linhas. A persistência dos dados é toda baseada na estrutura das entidades de suas classes. Isto é bastante favorável, pois não exige a existência de uma estrutura rígida baseada em um schema. Algum tempo atrás eu fiz uma série de experimentos com o Db4Objects (http://ferhenriquef.com/?s=db4o), um banco de dados orientado a objetos que funciona de forma parecida.

Um adendo: quando fiz a faculdade de Sistemas de Informação, na Universidade Presbiteriana Mackenzie, eu tive a possibilidade de escolher uma ênfase para o meu curso, e no caso escolhi a ênfase em Banco de Dados. Então, isso explica alguns dos meus posts e alguns dos experimentos neste blog. Sou vidrado em tecnologias diferentes de armazenamento de dados, mas acho que isso todos já perceberam.

mongoNet

Saiba mais

Agrupamento de dados via LINQ e Lambda

Nos últimos tempos, participando do fórum do MSND sobre LINQ (http://social.msdn.microsoft.com/Forums/pt-br/linqpt/threads ), notei que muitas dúvidas surgiram com relação a sintaxe do LINQ para o agrupamento de dados. Dessa forma, espero neste post fazer um breve overview da sintaxe do LINQ para agrupamento, e também demonstrar a sintaxe Lambda correspondente.

Contexto do exemplo
Para estes exemplos utilizei uma estrutura de dados chamada Cidade. Esta estrutura contém: o nome da cidade, a quantidade de habitantes que ali vivem e o estado desta cidade dentro do país.

Os dados utilizados para a execução do exemplo estão chumbados no código e são originados do seguinte método: Saiba mais

Linq to SQL – Atributos de Mapeamento Objeto-Relacional

Quando trabalhamos com LINQ to SQL nosso mapeamento objeto-relacional pode ser construído de duas maneiras: através de um arquivo externo (XML Mapping Source) ou através do mapeamento das classes da aplicação (Attribute Mapping Source). Na grande maioria dos casos acabamos por realizar o mapeamento dos atributos das classes da aplicação e utilizamos o Object Relational Designer – assistente do Microsoft Visual Studio que gera o mapeamento do banco de dados automaticamente para nossa aplicação.

O mapeamento ocorre da seguinte maneira:
- O banco de dados é mapeado para uma instância de um DataContext.
- Uma tabela é mapeada para uma classe
- As colunas da tabela são mapeadas para as propriedades das classes

Podemos construir esse mapeamento manualmente, sem utilizar o assistente do Microsoft Visual Studio, a fim de tornar o código mais simples, gerenciável e inteligível. Para tanto devemos fazer uso dos atributos de mapeamento do LINQ, tais atributos estão contidos no namespace System.Data.Linq.Mapping. Para ter acesso a esses atributos precisamos fazer referência a dll System.Data.Linq.

O mapeamento de uma tabela vai se parecer com o código a seguir:

Mapclasses

… baseado na estrutura da seguinte tabela:

clip_image003

Comparando o código C# e o código SQL, podemos considerar alguns pontos:
- O atributo Table, localizado acima da definição da classe Customer, indica que esta classe corresponde ao mapeamento de uma tabela, mais especificamente a tabela tbMappingCustomer, especificada pelo valor definido na propriedade Name .

- O atributo Column indica que uma propriedade corresponde a uma coluna da tabela, isto é, o atributo Column simboliza o mapeamento entre uma coluna da tabela e uma propriedade da classe.

- O atributo Column possui diversas propriedades Name e CanBeNull são apenas algumas, mas são algumas das principais. Em um próximo post discutiremos outras possibilidades. A propriedade Name do atributo Column indica qual coluna da tabela deverá ser mapeada pelo LINQ to SQL, e a propriedade CanBeNull indica quais colunas aceitam valores nulos na base de dados.

- As propriedades IsDbGenerated e IsPrimaryKey são propriedades do atributo Column, que são utilizadas apenas na propriedade ID, pois essa propriedade mapeia a chave primária da tabela. A propriedade IsDbGenerated indica que o atributo possui valores gerados pelo próprio banco de dados, no nosso caso os valores dessa coluna da tabela são gerados automaticamente pelo Identity(1, 1) citado no código SQL. A propriedade IsPrimaryKey é autoexplicativa, ela indica se a propriedade corresponde ao mapeamento da chave primaria da tabela.

Para persistir as informações é preciso utilizar um objeto que faça a ponte entre a aplicação e o banco de dados, este objetivo é o DataContext. A função do DataContext é traduzir o mapeamento objeto-relacional para comandos que possam ser interpretados pelo banco de dados, assim como converter os dados retornados pelo banco de dados para as entidades do mapeamento objeto-relacional.

No caso, costumo criar uma classe que herde de um DataContext, e que para cada tabela, crie-se um atributo do tipo Table<E> que referencie uma entidade mapeada para a aplicação. Na imagem abaixo demonstro como faço essa implementação.

DataContext

Abaixo um exemplo de como unir a utilização do DataContext customizado, com as entidades mapeadas manualmente.

Implementacao

Obrigado.
[]s!

Referências indicadas:
http://oreilly.com/catalog/9780596519254
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/09/23/24907.aspx
http://msdn.microsoft.com/en-us/library/bb386971.aspx

Windows Mobile using LINQ to XML to save data

Nessa aplicação é demonstrado como armazenar dados inseridos por um aplicativo mobile dentro do próprio dispositivo. Para consulta e inserção dos dados foi utilizado LINQ to XML. Esse aplicativo pode ser utilizado como exemplo para aplicações Mobile que precisem de uma forma de armazenamento leve e rápida…

http://code.msdn.microsoft.com/Windows-Mobile-and-LINQ-to-22d9dd67

LINQ To SQL – Comparação entre sintaxe Lambda e sintaxe LINQ

Boas! Faz um certo tempo que não posto nada devido a correria da faculdade e do trabalho, mas agora estou postando algo relativamente novo por aqui… Nesse exemplo eu faço diversas comparações entre a sintaxe LINQ (Query comprehension syntax) e a sintaxe Lambda. Uma coisa que eu descobri essa semana, é que o compilador processa a sintaxe LINQ transformando ela em sintaxe Lambda! (Você pode conferir essa informação no livro LINQ – Pocket Reference, na página 11) É sério! Eu achei isso muito interessante! Então, depois desse tapa na cara, nós podemos concluir que as queries que utilizam sintaxe Lambda são mais rápidas, pois não precisam ser reinterpretadas ao contrário das queries com sintaxe LINQ! Será? Quem poderá responder está questão? Tio Bill? Talvez… Voltando ao enfoque do post. O exemplo demonstra consultas utilizando os operadores: WHERE, LIKE, TAKE (Top), ORDER BY, GROUP BY, UNION, UNION ALL, FIRST e MAX. Acredito que estes sejam os operadores básicos para se fazer qualquer coisa… acredito que seja um pontapé interessante para quem nunca mexeu com LINQ. Dentro do exemplo tem um script que irá criar a tabela do exemplo no MS SQL Server (rodem o script na base de vocês! por favor!), além disso deve-se alterar a String de Conexão do método “GetSQLConnectionString()” e por fim os registros serão inseridos na tabela pela aplicação via LINQ depois que ela for executada pela primeira vez. Fico por aqui então… vlw!

http://code.msdn.microsoft.com/LINQ-To-SQL-Comparao-entre-44b6ac90

LINQ To XML

Como parte das novidades do .Net Framework 3.5 o LINQ To XML auxilia o desenvolvedor na construção e consulta de dados no formato XML. Neste aplicativo é demonstrado como criar, consulta e exibir dados em formato XML através do LINQ To XML.

http://code.msdn.microsoft.com/LINQ-To-XML-5ca6d9c6

Aplicação em Camadas Utilizando LINQ – (Inclui exemplos de AjaxControlToolKit)

Esse é um exemplo de aplicativo em 4 camadas. A primeira camada é a Camada de Layout (página .aspx), a segunda camada é a Camada Estrutural(as entidades, seus métodos e propriedades), a terceira camada é onde faço uso da sintaxe do LINQ, podemos chamar essa camada de Camada de Persistência a Dados e por fim a quarta camada corresponde a Camada de Acesso a Dados(nessa camada o LINQ trabalha sozinho =D). Beleza, além disso temos o uso de alguns objetos do Ajax Control Tool Kit (Calendar Extender & Confirm Button Extender). Ponto importante: Observem que nas classes do LINQ eu alterei seus níveis de acesso, alterei todas para INTERNAL, assim respeitamos a regra de encapsulamento e teremos total controle sobre o que entra ou sai da base de dados… Dentro do exemplo existe um script do SQL pra criar as tabelas necessárias, além disso é preciso alterar a string de conexão… ps: não reparem no layout! ficou bem simples, mas a intenção era demonstrar o uso das camadas e do LINQ. =D

http://code.msdn.microsoft.com/Aplicao-em-Camadas-40c53736

Busca binária

O objetivo deste post é apresentar um meio eficiente de busca de objetos em memória.

O surgimento da sintaxe LINQ, assim como a utilização de query methods, facilitou a busca em memória. Com estes recursos podemos facilmente executar queries em arrays, coleções e listas de tipos genéricos. O uso deste modelo de sintaxe agiliza o processo de desenvolvimento por tornar a busca em memória trivial e de simples codificação.

Mas, ao adotarmos esse modelo de sintaxe, estamos realmente escrevendo código performático? Será que essas consultas em memória são o modelo mais rápido de pesquisa? Não estaríamos perdemos poder computacional ou tempo de processamento ao adotar estes recursos em determinados cenários de pesquisa em memória?

Dada a necessidade de executar consultas eficientes e com baixo custo computacional, passamos a evitar consultas que consumam muitos recursos computacionais e que sejam lentas.

A busca binária é um algoritmo de busca que segue o paradigma da divisão e conquista. Partindo do pressuposto de que o conjunto de elementos está ordenado, são executadas diversas divisões do espaço de busca restringindo o possível local no qual o elemento buscado está posicionado. A imagem a seguir ilustra o processo de divisão do conjunto de elementos realizado pela busca de elementos.

clip_image002

Saiba mais

Gerando registros de log automáticos com o Entity Framework

Uma tarefa bastante recorrente durante o desenvolvimento de sistemas é a criação de rotinas de log. E o Entity Framework facilita a nossa vida quando temos de fazer isso.

Com o Entity Framework podemos criar uma customização que encapsule os comandos que serão enviados para o banco de dados e então adicionar uma lógica que gere os registros de log necessários para cada operação.

log de dados

Saiba mais

Construindo camadas de acesso a dados – Parte V – Unity of Work

O padrão Unit of Work mantém um rastreamento sobre todas as alterações que possam alterar sua fonte de dados durante uma transação. Assim, quando todas as alterações já tiverem sido executadas o padrão fica responsável por persistir todas na fonte de dados.

Geralmente, não somos responsáveis por implementar este padrão, acabamos por consumi-lo em ferramentas de persistência, como: Entity Framework, NHibernate e LINQ to SQL.

Saiba mais

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 70 outros seguidores