A maioria dos aplicativos é centrada em dados, porém a maioria dos data warehouses são bancos de dados relacionais. Ao longo dos anos, designers e desenvolvedores desenvolveram aplicativos baseados no modelo de objetos.
Os objetos são responsáveis por conectar componentes que acessam dados – chamados de Data Access Layer (DAL). Aqui precisamos considerar três pontos:
Todos os dados exigidos por um aplicativo não precisam ser armazenados em um único recurso. Este recurso pode ser um banco de dados relacional, business object, arquivo XML ou um servidor WEB.
Acessar objetos na memória é mais simples e barato do que acessar dados em bancos de dados e arquivos XML.
Os dados acessados não são usados diretamente, mas são despejados, classificados, agrupados, modificados, etc.
Portanto, seria muito útil se existissem ferramentas que pudessem integrar facilmente todos os tipos de dados com apenas algumas linhas de código - ferramentas que pudessem integrar dados de diferentes fontes e serem capazes de realizar operações básicas de dados.
A Consulta Integrada à Linguagem (LINQ) é uma dessas ferramentas. LINQ é uma extensão do .NET Framework 3.5 e sua linguagem de gerenciamento torna as consultas mais parecidas com objetos. Ele define uma sintaxe comum e um modelo de programa que nos permite usar uma sintaxe idiomática para completar a busca por diferentes tipos de dados.
Operações relacionadas como pesquisa, projeto, link, grupo, partição, operações de conjunto, etc. podem ser usadas no LINQ, e os compiladores C# e VB no .NET Framework 3.5 suportam a sintaxe LINQ, que permite armazenar dados de configuração, sem recorrer a ADO.NET.
Por exemplo, para consultar a tabela Consumidores no banco de dados Northwind, utilizando LINQ em C#, o código deve ser o seguinte:
var data = from c in dataContext.Customerswhere c.Country == "Espanha"select c;
em:
A palavra-chave from passa logicamente por cada coleção em sequência.
Expressões contendo a palavra-chave where comparam cada objeto na coleção.
A instrução select selecionará o objeto comparado e o adicionará à lista e o retornará.
A palavra-chave var é usada para declaração de variáveis. Como o tipo exato do objeto retornado não é claro, isso indica que as informações precisam ser inferidas dinamicamente.
As instruções de consulta LINQ podem ser aplicadas a qualquer classe com suporte de dados que herda de IEnumerable, onde T pode ser qualquer tipo de dados, como List<Book>.
Vejamos um exemplo para entender o conceito. A seguinte classe é usada no exemplo: Book.cs
public class Livros{ public string ID {get set;} public static List<Livros> GetBooks() { get; List<Livros> list = new List<Livros>(); list.Add(new Livros { ID = "001", Title = "Programação em C#", Preço = 634,76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "Aprenda Jave em 30 dias", Preço = 250,76 milhões, DateOfRelease = Convert.ToDateTime ("15/08/2011") }); list.Add(novos livros { ID = "003", Title = "Programação em ASP.Net 4.0", Preço = 700,00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); Título = "VB.Net facilitado", Preço = 500,99 milhões, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(novos livros { ID = "005", Title = "Programação em C", Preço = 314,76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(novos livros { ID = "006", Title = "Programação em C++", Preço = 456,76 milhões, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(novos livros { ID = "007", Título = "Desenvolvimento da base de dados", Preço = 1000,76 milhões, DateOfRelease = Convert.ToDateTime("2010-02-05") }); lista; }}
Use esta classe em uma página da web para ter um controle de rótulo simples para exibir o título do livro. O método Page_Load cria uma lista de livros e retorna os títulos usando uma consulta LINQ:
consulta simples de classe parcial pública: System.Web.UI.Page{protegido void Page_Load(objeto remetente, EventArgs e) { List<Books> books = Books.GetBooks(); var título em títulos de livros) lblbooks.Text += String.Format("{0} <br />", título }});
Quando a página da web é executada, a tag exibe os resultados da consulta:
A expressão LINQ acima:
var booktitles = de b em livros selecione b.Title;
Equivalente à seguinte instrução SQL:
SELECIONE o título dos livros
Além dos operadores usados até agora, existem muitos outros operadores para executar cláusulas de consulta. Vejamos alguns operadores e cláusulas.
A 'cláusula de junção' em SQL é usada para unir duas tabelas de dados e exibir uma coleção de dados em colunas que aparecem em ambas as tabelas de dados. LINQ também pode oferecer suporte a essa funcionalidade. Para verificar isso, adicione outra classe chamada Saledetails.cs ao projeto anterior:
public class Salesdetails{ public int sales { get; public int pages { get } public string ID {get set;} public static IEnumerable<Salesdetails> getsalesdetails[] sd = { new Salesdetails { ID = "001", páginas = 678, vendas = 110000}, novos detalhes de vendas { ID = "002", páginas = 789, vendas = 60.000}, novos detalhes de vendas { ID = "003", páginas = 456, vendas = 40.000}, novos detalhes de vendas { ID = "004", páginas = 900, vendas = 80.000}, novos detalhes de vendas { ID = "005", páginas = 456, vendas = 90.000}, novos detalhes de vendas { ID = "006", páginas=870, vendas = 50000}, new Salesdetails { ID = "007", páginas=675, vendas = 40000}, };
Adicione código na função Page_Load para concluir a consulta nas duas tabelas usando o processamento da cláusula join:
protegido void Page_Load(objeto remetente, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); é igual a s.ID select new { Name = b.Title, Pages = s.pages }; títulos de livros) lblbooks.Text += String.Format("{0} <br />", título);}
A página de resultados é exibida da seguinte forma:
A cláusula where permite que condições de filtragem sejam adicionadas à consulta. Por exemplo, se você deseja obter bibliografias com mais de 500 páginas, você pode alterar o identificador no método Page_Load para ficar assim:
var booktitles = from b in books join s in sales on b.ID é igual a s.ID onde s.pages > 500 select new { Name = b.Title, Pages = s.pages };
A instrução de consulta retorna apenas as colunas com contagem de páginas superior a 500:
Essas cláusulas permitem que os resultados da consulta sejam classificados. Para consultar o título, o número da página e o preço do livro e classificá-los por preço, escreva o seguinte código no identificador do método Page_Load:
var booktitles = de b em livros join s em vendas em b.ID é igual a s.ID orderby b.Price select new { Nome = b.Título, Páginas = s.pages, Preço = b.Price};
A tupla retornada é:
A cláusula let permite definir uma variável e atribuir a ela um valor calculado a partir dos dados. Por exemplo, para calcular o valor total de vendas a partir dos dois valores de vendas acima, você precisa calculá-lo assim:
TotalSale = Preço do livro * Vendas
Para completar esta equação, adicione o seguinte trecho de código ao identificador do método Page_Load:
A cláusula let permite definir uma variável e atribuir a ela um valor calculado a partir dos dados. Por exemplo, para calcular o valor total de vendas a partir dos dois valores de vendas acima, você precisa calculá-lo assim:
var booktitles = de b no livro join s em vendas em b.ID é igual a s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};
Os resultados da consulta são mostrados abaixo: