LINQ - Language Integrated Query

by Fabiano 22. março 2008 21:40

Olá pessoal vou começar uma serie de artigos falando do LINQ. Mas antes de começarmos a trabalhar diretamente com ele, gostaria de falar um pouco sobre sua teoria e explicar melhor seu conceito para que possamos explorar o máximo de seus recursos.
Primeiro vou falar sobre a ferramenta, em seguida vamos percorrer quase todas suas funcionalidades. Acredito que isso levara uma serie de artigos espero que vocês gostem e passem a aproveitar o máximo desta ferramenta que tanto tem a nos oferecer. Vamos La...

Definição:

Segundo a definição da Microsoft Linq é um conjunto de extensões do .Net Framework, bem como das novas linguagens (VB9 e C#) que provêem novas capacidades dentro de um ambiente de programação, executar queries em dados armazenados na memória ou em um repositório de dados externo, como um SGBD ou arquivo XML.

Transformando em uma linguagem mais prática, é uma tecnologia que nos permite abstrair a sintaxe SQL (no caso de pesquisa em BD) e ao mesmo tempo unificar a sintaxe de pesquisas nos mais diversos meios de armazenamento de informações como: Arrays, XML, etc. 

A Microsoft então diferenciou o LINQ de acordo com o tipo de dado onde ele vai realizar a pesquisa, daí surgiram os nomes: 

Neste primeiro artigo vou explorar o LINQ  to SQL e nos próximos vamos falando de suas outras extensões.

 

LINQ to SQL:

É uma implementação específica do LINQ para o SQL Server que converte consultas escritas em C# ou Visual Basic em SQL dinâmico, provendo uma interface que permite mapear os objetos do banco de dados gerando as classes para realizar as operações usando a sintaxe LINQ; 

Também permite realizar alterações nos objetos e atualizar o banco de dados. 

Inicialmente o LINQ To SQL só funciona com Banco de Dados SQL Server devido ao padrão adotado pela Microsoft  "ANSI“

Se todos os fabricantes de Banco de Dados adotassem este mesmo padrão então o LINQ funcionaria para todos os Bancos de Dados, mas a equipe do projeto LINQ esta trabalhando para que outros fornecedores de banco de dados façam a implementação para seus produtos. Vamos aguardar...

O/R Mapping 

O modelo de mapeamento objeto relacional para banco de dados SQLServer, consiste no mapeamento das:

Tabelas do banco de dados como classes;

Campos como propriedades; 

Procedures e funções como métodos;

Desta forma você tem no designer de classe da aplicação um conjunto de classes que representam visão 1:1 do seu banco de dados.

 

Note que a representação de classes é a mesma que a do banco de dados, até mesmo suas chaves primárias e relacionamentos. Esse passa a ser nosso modelo de entidades, e também o Objeto de Acesso ao Banco de Dados.

Ele mantém toda esta estrutura para utilizar da melhor forma possível na hora de montar a string SQL.

Entendendo o objeto DataContext:

Após você arrastar suas tabelas e procedures para dentro do diagrama como no exemplo acima, ao clicar no salvar o Visual Studio ira gerar classes que representam as entidades e relacionamentos que temos de dados modelado. Para cada diagrama LINQ SQL e adicionado à nossa solução, uma classe DataContext. Esta classe é o principal canal pelo qual nós teremos acesso a entidades de pesquisa do banco de dados, bem como inserções as alterações. A classe criada DataContext terá propriedades que representam cada um quadro dentro de nós modelado o banco de dados, bem como métodos para cada procedimento armazenado é acrescentado.

Por exemplo, abaixo está a classe DataClassesDataContext que é baseado no modelo que criamos acima:


 

Note que temos a classe Customer com todas as colunas da tabela agora como Propriedade da classe, e isso para todas as outras tabelas adicionadas no diagrama.

Gostaria de deixar claro que tudo que e gerado automaticamente pelo LINQ e feito de uma maneira muito mais clara e limpa que por exemplo os DataSets Tipados, agora conseguimos ter o controle total do que esta sendo gerado, pois como mostrei acima conseguimos ver as classes geradas ter acesso ao código e ate mesmo criar tudo isso na mão, gosto de ressaltar isso porque traz mais confiança no processo, pois muitas pessoas criticavam muito a MS pelos códigos gerados dinamicamente de baixa qualidade com o LINQ isso e muito diferente.

E o que e mais legal e a economia de tempo acompanhada com a qualidade de arquitetura que ganhamos utilizando os diagramas LINQ, pois quantos projetos foram gerados sem terem ao menos um único diagrama de classe, agora você será obrigado a ter pelo menos um, mas isso e um outro assunto... Não quero começar a falar de arquitetura neste artigo mais podemos falar disso no futuro, de como ficaria uma arquitetura de aplicação com LINQ.

Agora que já vimos as facilidades e vantagens de definição de projeto, vamos colocar a mão na massa.

 

Criando Querys:

Agora que já temos nosso diagrama criado vamos escrever facilmente algumas Querys muito utilizadas em nosso dia a dia, onde poderemos ter idéia da potencia e facilidade agregada a rotinas de acesso a dados.

O código a seguir usa sintaxe LINQ query para obter uma seqüência de Produto. Observe como o código está pesquisando em todos os Produto/Categoria fazendo um JOIN para obter apenas os produtos da categoria “Confections”:

DataClassesDataContext Db = new DataClassesDataContext();

var ProdutosConf = from p in Db.Products

                   where p.Category.CategoryName == "Confections"

                   select p;

O código abaixo demonstra como recuperar um único produto a partir do banco de dados, atualizar o seu preço e, em seguida, salvar as alterações de volta no banco de dados

DataClassesDataContext Db = new DataClassesDataContext();

Product produtoDb = Db.Products.Single(p => p.ProductID == 54);

produtoDb.UnitPrice = 25;
produtoDb.UnitsInStock = 4;

Db.SubmitChanges();

O código abaixo demonstra como inserir um novo produto na tabela.

DataClassesDataContext Db = new DataClassesDataContext();
Product produtoDbNew = new Product();

produtoDbNew.ProductName = "The Club";
produtoDbNew.SupplierID = 1;
produtoDbNew.CategoryID = 2;
produtoDbNew.QuantityPerUnit = "35 pages";
produtoDbNew.UnitPrice = 99;
produtoDbNew.UnitsInStock = 150;
produtoDbNew.UnitsOnOrder = 15;
produtoDbNew.ReorderLevel = 50;
produtoDbNew.Discontinued = false;

Db.Products.InsertOnSubmit(produtoDbNew);

Db.SubmitChanges();

Agora vamos deleterar um produto.

DataClassesDataContext Db = new DataClassesDataContext();
Product produtoDbRemove = Db.Products.Single(p => p.ProductID == 54);

Db.Products.DeleteOnSubmit(produtoDbRemove);

Podemos tambem deletar varios produtos de uma so vez, como no exemplo abaixo onde faço um select de todos os produtos que tenhão “HOT” em seu nome e mando deletar todos eles.
PS: o Contains utilizado na query abaico corresponde ao LIKE %% do SQL.

var produtos = from p in Db.Products
             where p.ProductName.Contains("Hot")
             select p;

Db.Products.DeleteAllOnSubmit(produtos);

Agora vamos fazer a chamada da storeprocedure adicionada em nosso diagrama, lembrando que quando adicionamos  procedures elas se tornam métodos e sua chamada fica bem simples de implementar como no exemplo abaixo onde chamo a proc “CustOrdersOrders” que passado um Id de cliente ela retorna todas as ordens do cliente.

DataClassesDataContext Db = new DataClassesDataContext();

var resultadodaconsulta = Db.CustOrdersOrders("BONAP");

O que e bem legal e que os parametros da procedure passam a ser parametros da assinatura do metodo criado pelo Visual Studio e quer mais uma coisa muito legal após obtermos o resultado podemos ter acesso direto no intelisence aos campos de retorno da procedure como na imagem abaixo.

Isso e muito legal, veja o compilador foi la na procedure viu os campos de retorno e já disponibilizou aqui para que possamos utilizar sem nem sequer sabermos quais campos tinhas para retorno dentro da procedure.

Espero que tenham gostado tanto do artigo como do LINQ, nos próximos artigos continuarei falando de LINQ talvez explore um pouco mais o SQL mais falaremos bastante de LINQ  ainda.

Bons Códigos...


 

Tags: , , ,

.Net

Como Utilizar Left Join em Consultas LINQ to SQL

by Fabiano 18. março 2008 21:28

 

Ultimamente tenho recebido nos treinamentos varios alunos tem me perguntado se e possivel fazer LEFT JOIN em consultas LINQ estão resolvi escrever este pequeno artigo com um exemplo de como fazer.  Espero poder abrir um caminho que os levara a consultas LINQ cada vez mais otmizadas e inteligente.

Vamos ao exemplo:

Para isso vou utilizar as tabelas de Customers e de Orders ( Clientes e Pedidos)  no Banco de Dados Northwind, adcionei um novo Cliente sem nenhum pedido, vou criar um SELECT com LEFT JOIN que me retorne todos os clientes que o nome comece com a letra(“F”)  mesmo que eles não tenham registros na tabela de pedido.

NorthwindDataContext db= new NorthwindDataContext();

        var query=  from c in db.Customers

                    where c.CustomerID.StartsWith("F")

                    join o in db.Orders on c.CustomerID equals o.CustomerID into sr

                    from x in sr.DefaultIfEmpty()

                    select new {CustomerID= c.CustomerID, ContactName=c.ContactName, OrderID = x.OrderID == null ? -1 : x.OrderID};   

Veja que eu usei o operador join into na Query o que resultou em um LEFT JOIN, Eu adcionei meu filtro no final da clausula WHERE, e retornei um tipo anonimo que contem  CustomerID, ContactName, e OrderID onde -1 corresponde os clientes que não tem nenhum pedido e os que tem pedido retornamos o ID do pedido.

Veja a string SQL correspondente:

SELECT [t0].[CustomerID], [t0].[ContactName], 

    (CASE 

        WHEN [t1].[OrderID] IS NULL THEN @p1

        ELSE [t1].[OrderID]

     END) AS [value]

FROM [dbo].[Customers] AS [t0]

LEFT JOIN [dbo].[Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]

WHERE [t0].[CustomerID] LIKE @p0

Observe como o LEFT JOIN aparece, perceba como o case reflete IF/ELSE que eu adicionei na Query acima.

Bons Códigos...

 

Tags: , ,

.Net

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Fabiano Belmonte

Senior Architect, especialista em aplicações e-business com larga experiência em B2B (Submarino. Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-commerce, gerenciamento logístico entre outras.