O documento apresenta uma introdução ao LINQ (Language Integrated Query), incluindo suas principais funcionalidades como consultas declarativas em objetos, XML e bancos de dados SQL, além de exemplos de seu uso.
LINQ – LanguageIntegrated Query Dalton Cézane Wireless Laboratório de Instrumentação Eletrônica e Controle
2.
O que éLINQ? Existe o problema de se manipular dados e objetos de duas maneiras diferentes: declarativa, para dados, e imperativa, para objetos; LINQ é um modelo de programação unificado para “qualquer tipo de dado”; Introduz mais sintaxe declarativa: ajuda o sistema a encontrar a melhor estratégia de execução.
3.
Hello LINQ! usingSystem; using System.Linq; string[ ] saudacoes = { "Oi LIEC", "Oi LINQ", "Oi turma" }; var itens = from s in saudacoes where s.EndsWith("LINQ") select s; foreach (var item in itens) Console.WriteLine(item);
4.
Consultas em XMLusing System; using System.Linq; using System.Xml.Linq; XElement livros = XElement.Parse( @"< livros> < livro> <titulo>Pro LINQ: Language Integrated Query in C# 2008</titulo> <autor>Joe Rattz</autor> </ livro> < livro> <titulo>Pro WF: Windows Workflow in .NET 3.0</titulo> <autor>Bruce Bukovics</autor> </ livro> < livro> <titulo>Pro C# 2005 and the .NET 2.0 Platform, Third Edition</titulo> <autor>Andrew Troelsen</autor> </ livro> </ livros>");
5.
Consultas em XMLvar titulos = from livro in livros.Elements(“livro") where (string) livro.Element("autor") == "Joe Rattz" select livro.Element("titulo"); foreach(var titulo in titulos) Console.WriteLine(titulo.Value);
6.
Consultas em SQLServer using System; using System.Linq; using System.Data.Linq; using nwind; Northwind db = new Northwind(@"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind"); var clientes = from c in db.Clientes where c.Cidade == "Rio de Janeiro" select c; foreach (var cliente in clientes) Console.WriteLine("{0}", cliente. NomeCompanhia);
7.
Consultas: tipos retornadosIEnumerable<T>: tipo de retorno das seqüências obtidas pelas consultas realizadas em objetos (conjuntos de objetos); IQueryable<T>: tipo de retorno das seqüências obtidas pelas consultas realizadas com SQL (bases de dados); T é o tipo de dados dos objetos armazenados na seqüência de retorno de uma consulta;
8.
Componentes LINQ paraobjetos (arrays e coleções de dados na memória - System.Linq.Enumerable); LINQ para XML (lidar com arquivos XML - using System.Xml.Linq); LINQ para DataSets (consultas relacionadas com DataSets); LINQ para SQL (API IQueryable<T> que permite trabalhar com bancos de dados SQL Server - using System.Data.Linq);
9.
Componentes LINQ paraentidades: uma alternativa para se trabalhar desacoplando o modelo de objetos do banco de dados físico, através de um mapeamento lógico entre os dois. Isto pode prover maior flexibilidade e poder ao sistema.
10.
Arquitetura . NetLanguage Integrated Queries LINQ para Objetos LINQ para SQL LINQ para XML Objetos Bases de dados <xml> XML C# 3.0 VB9 Outras…
11.
LINQ não éapenas para consultas Converter um array de strings em um array de inteiros: string[] numeros = { "0042", "010", "9", "27" }; int[] nums = numeros.Select(s => Int32.Parse(s)).ToArray(); Realizar o mesmo processo ordenando o array de inteiros: string[] numeros = { "0042", "010", "9", "27" }; int[] nums = numeros.Select(s => Int32.Parse(s)).OrderBy(s => s).ToArray();
12.
var Usar apalavra-chave “var”, quando não tiver certeza de um tipo de retorno: // Este código não compila. Northwind db = new Northwind(@"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind"); IEnumerable< ? > pedidos = db.Clientes .Where(c => c.País == “Brasil" && c.Regiao == “Ne") .SelectMany(c => c.Pedidos);
13.
var //Agora compila.Northwind db = new Northwind(@"DataSource=.\SQLEXPRESS;Initial Catalog=Northwind"); var pedidos = db.Clientes .Where(c => c.País == “Brasil" && c.Regiao == “Ne") .SelectMany(c => c.Pedidos); Console.WriteLine(pedidos.GetType()); Resultado: System.Data.Linq.DataQuery`1[nwind.Pedidos]
14.
Lazy evaluation varnumeros = new List<int>( ); numeros.Add (1); // Constrói consulta IEnumerable<int> consulta = numeros.Select (n => n * 10); numeros.Add (2); // Adicionando um elemento foreach (int n in consulta) Console.Write (n + "|"); // 10|20|
15.
Lazy evaluation varnumeros = new List<int>( ) { 1, 2 }; IEnumerable<int> consulta = numeros.Select (n => n * 10); foreach (int n in consulta) Console.Write (n + "|"); // 10|20| numbers.Clear( ); foreach (int n in consulta) Console.Write (n + "|"); // nada
16.
Lazy evaluation intfator = 10; var consulta2 = numeros.Select (n => n * fator); fator = 20; // Alterando o fator foreach (int n in consulta2) Console.Write (n + "|"); // 20|40|
17.
Cast ou OfType Como usar LINQ com coleções “legadas” em código base existente? A diferença entre Cast e OfType é: o primeiro testa todos os tipos dos objetos e caso haja algum no qual não possa ser realizado o cast uma exceção é lançada, já no segundo são recuperados apenas os elementos nos quais se pode realizar “cast”.
18.
Operador Cast// I'll build a legacy collection. ArrayList arrayList = new ArrayList(); // Sure wish I could use collection initialization here, but that // doesn't work with legacy collections. arrayList.Add("Adams"); arrayList.Add("Arthur"); arrayList.Add("Buchanan"); IEnumerable<string> nomes = arrayList. Cast <string>().Where(n => n.Length < 7); foreach(string nome in nomes) Console.WriteLine(nome);
19.
Operador OfType// I'll build a legacy collection. ArrayList arrayList = new ArrayList(); // Sure wish I could use collection initialization here, but that // doesn't work with legacy collections. arrayList.Add("Adams"); arrayList.Add("Arthur"); arrayList.Add("Buchanan"); IEnumerable<string> nomes = arrayList. OfType <string>().Where(n => n.Length < 7); foreach(string nome in nomes) Console.WriteLine(nome);
20.
Dica Cuidado aoinicializar uma consulta em determinada variável, pois erros só serão percebidos quando a mesma for executada.
21.
Exemplo string[] strings= { “um", “dois", null , “três" }; Console.WriteLine(“Antes do Where() ser chamado."); IEnumerable<string> ieStrings = strings.Where(s => s.Length == 3 ); Console.WriteLine(“Depois do Where() ser chamado."); foreach(string s in ieStrings) { Console.WriteLine("Processando " + s); }
22.
Exemplo Resultado: Antes do Where() ser chamado. Depois do Where() ser chamado. Processando um Processando dois Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. …
23.
Expressões Lambdavar filteredNames = names.Where (n => n.Length >= 4); IEnumerable<string> filteredNames = from n in names where n.Length >= 4 select n;
Sub-consultas string[] nomes= { "Tom","Dick","Harry","Mary","Jay" }; IEnumerable<string> consulta1 = nomes .Where (n => n.Length == nomes.OrderBy (n2 => n2.Length) .Select (n2 => n2.Length).First( )); // Resultado: Tom, Jay IEnumerable<string> consulta2 = from n in nomes where n.Length == (from n2 in nomes orderby n2.Length select n2.Length).First( )) select n; // “comprehension query”
28.
Sub-consultas IEnumerable<string> consulta3= from n in nomes where n.Length == nomes.OrderBy (n2 => n2.Length).First( ).Length select n; IEnumerable<string> consulta4 = from n in nomes where n.Length == nomes.Min (n2 => n2.Length) select n; // com uso de Min
29.
Sub-consultas int menor= nomes.Min (n => n.Length); IEnumerable<string> consulta6 = from n in nomes where n.Length == menor select n;
30.
Referências RATTZ Jr,Joseph C. Pro LINQ – Language Integrated Query in C# 2008. Apress. 2007. EL-DIN, Mohammed Hossam. C# 3.0 & LINQ Project presentation. Linqpocket.