tudo o que sempre quis saber sobre o linq
DESCRIPTION
O LINQ já existe há algum tempo, mas por vezes é visto como um bicho de 7 cabeças, e é muitas vezes descartado quando as alternativas são “mais simples”. Mas o LINQ também é simples, e oferece vantagens quando se pretende obter, pesquisar e actualizar dados em (qualquer) fonte de dados. Mais, fá-lo de uma maneira consistente e sempre utilizando a mesma sintaxe. Quer obter ou pesquisar dados em Objectos? Quer obter ou pesquisar dados em BDs? Quer obter ou pesquisar dados em XML? Quer obter ou pesquisar dados em listas de Sharepoint? O LINQ permite tudo isto e mais através dos seus diversos "providers". Venha então descobrir nesta sessão tudo o que o LINQ tem para oferecer, e descobrir que afinal talvez o LINQ seja a solução ideal para a sua aplicação.TRANSCRIPT
![Page 1: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/1.jpg)
http://netponto.org10ª Reunião Presencial – 15/05/2010
Tudo o que sempre quis saber sobre LINQSérgio Amendoeira
![Page 2: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/2.jpg)
Sérgio Amendoeira
• Arquitecto de Soluções na Tecnocom Portugal. • Responsável pelo desenvolvimento de diversas
Arquitecturas de Referência para aplicações da Tecnocom em tecnologias Microsoft.
• Membro do Grupo de Arquitectura de Software (GASP)
• Speaker nos eventos TechDays (2005 e 2007, 2010).
![Page 3: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/3.jpg)
Agenda
• Introdução• LINQ - Como funciona?• LINQ sobre objectos em memória• LINQ sobre dados externos• LINQ to Anything• Parallel LINQ
![Page 4: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/4.jpg)
Também disponível em vídeo...
Assista!http://www.vimeo.com/15022564
![Page 7: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/7.jpg)
Introdução• Qual a linguagem mais utilizada para realizar queries sobre dados
relacionais?
T-SQL
Select Bares.NomeFrom BaresWhere Localidade = ‘Lisboa’
![Page 8: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/8.jpg)
LINQ
var baresEmLisboa = from bar in listaBareswhere bar.Localidade == “Lisboa”select bar.Nome;
Introdução• Qual a linguagem mais utilizada para realizar queries sobre dados
relacionais?
![Page 9: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/9.jpg)
Introdução• Podemos pesquisar sobre qualquer tipo de objecto?
Não e Sim
IEnumerable<T>
- List<T>- Arrays- Ancestors<T>- Descendants<T>- ...
IQueryable<T>
- Table<T>- ...
Dados em Memória Dados Externos
![Page 10: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/10.jpg)
LINQ – Como Funciona
var baresEmLisboa = listaBares.Where(bar => bar.Localidade == “Lisboa”).Select(bar => bar.Nome);
List<Bar> listaBares;
var baresEmLisboa = from bar in listaBareswhere bar.Localidade == “Lisboa”select bar.Nome;
Tradução Sintática
Expressões Lambda
![Page 11: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/11.jpg)
LINQ – Como funciona?
var baresEmLisboa = listaBares.Where(bar => bar.Localidade == “Lisboa”).Select(bar => bar.Nome);
var baresEmLisboa = Enumerable.Select( Enumerable.Where(
listaBares, bar => bar.Localidade == “Lisboa”),
bar => bar.Nome);
Métodos de Extensão
![Page 12: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/12.jpg)
LINQ – Como funciona?
bar => bar.Localidade == “Lisboa”
delegate(Bar bar) { return bar.Localidade == “Lisboa”; }
bar => bar.Nome
delegate(Bar bar){ return bar.Nome; }
var baresEmLisboa = Enumerable.Select( Enumerable.Where( listaBares, delegate(Bar bar) { return bar.Localidade == “Lisboa”; } ), delegate(Bar bar) { return bar.Nome; } );
Lambdas como
Delegates
![Page 13: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/13.jpg)
LINQ – Como funciona?
class anonymous{ public string NomeBar { get; set; } public decimal Entrada { get; set; }}
var entradasEmBares = from bar in listaBareswhere bar.Localidade == “Lisboa”select new {
NomeBar = bar.Nome, bar.Entrada }
Tipos Anónimos
Variável de Tipo
Implícito
![Page 14: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/14.jpg)
LINQ – Como funciona?
lista 1 2 3 4 5
List<int> lista;
var query = from elemento in lista select elementoforeach(int elemento in query) { Print(elemento) ; }
for(int i=0;i<lista.Count; i++) { lista[i] = -lista[i] ; }
foreach(int elemento in query) { Print(elemento) ; }
Resultado? DelayedExecution
b) 1 2 3 4 5 1 2 3 4 5c) 1 -2 3 -4 5 -1 2 -3 4 -5
a) 1 2 3 4 5 -1 -2 -3 -4 -5a) 1 2 3 4 5 -1 -2 -3 -4 -5
![Page 15: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/15.jpg)
LINQ (Objectos em Memória)
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
![Page 16: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/16.jpg)
LINQ to SQL
LINQ +DataContext (ORM)
- Suporte para LINQ (IQueryable<T>)- Designer Gráfico- Object Tracking- Lazy Loading- Insert / Update / Delete
![Page 17: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/17.jpg)
LINQ to SQL – Como funciona?
bar => bar.Localidade == ´Lisboa’ bar => bar.Nome Lambdas como
ExpressionTrees
==
. ’Lisboa’
bar Localidade
.
bar Nome
![Page 18: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/18.jpg)
LINQ to SQL – Como funciona?
Table<T>
Expression Trees
var query = from bar in contexto.Bars select bar
query.ToList()
![Page 19: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/19.jpg)
LINQ to SQL – Como funciona?
Table<T>
T-SQL Query
var query = from bar in contexto.Bars select bar
query.ToList()
Transformação efectuada aqui
![Page 20: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/20.jpg)
LINQ to SQL
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
![Page 21: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/21.jpg)
LINQ to Anything
Dados Em Memória
- IEnumerable<T>
- Where- ...
Dados Externos
- IQueryable<T>- IOrderedQueryable<T>
- Suportar OrderBy- IQueryProvider
• Podemos pesquisar sobre qualquer objectos?
Não e Sim
![Page 22: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/22.jpg)
LINQ to Anything (IEnumerable)
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
![Page 23: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/23.jpg)
LINQ to Anything (IQueryable<T>)– LINQ to Sharepoint– LINQ to Entities– LINQ to Google– dotConnect
– LINQ to Oracle, MySQL, PostgreSQL, and SQLite
– LINQ to CSV– LINQ to Wikipedia– LINQ to Twitter– ...
![Page 24: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/24.jpg)
Parallel LINQDados Em Memória
- ParallelQuery<T>
var baresEmLisboa = from bar in listaBareswhere bar.Localidade == “Lisboa”select bar.Nome;
![Page 25: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/25.jpg)
var baresEmLisboa = from bar in listaBares.AsParallel()where bar.Localidade == “Lisboa”select bar.Nome;
Parallel LINQDados Em Memória
- ParallelQuery<T>
![Page 26: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/26.jpg)
Parallel LINQ– Paralelização de queries, mas apenas se PLINQ achar que se
ganha algo por correr em paralelo.– Override
com .WithExecutionMode(ParallelExecutionMode)– Usa todos os processadores até ao máximo de 64
– Override com .WithDegreeOfParallelism(int)– Preservação de ordenação de origem
– Default sem preservação (.AsUnordered()) mas override com .AsOrdered()
![Page 27: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/27.jpg)
Parallel LINQ– Saltar entre processamento Paralelo e Sequencial
ParallelQuery<T> IEnumerable<T>
.AsSequential()
.AsParallel()
![Page 28: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/28.jpg)
Parallel LINQ– Merge das threads de PLINQ depende de operadores mas
pode ser forçado (.WithMergeOptions(ParallelMergeOptions))– NotBuffered
1
2
3
4
5
6
7
8
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Devolve Resultado
Devolve Resultado
Devolve Resultado
Devolve Resultado
Devolve Resultado
Devolve Resultado
Devolve Resultado
Devolve Resultado
![Page 29: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/29.jpg)
Parallel LINQ– AutoBuffered
1
2
3
4
5
6
7
8
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Devolve Resultados
Devolve Resultados
Devolve Resultado
![Page 30: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/30.jpg)
Parallel LINQ– FullBuffered
1
2
3
4
5
6
7
8
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Devolve Resultados
![Page 31: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/31.jpg)
Parallel LINQ– .ForAll(Action<T>) = foreach em paralelo (sem merge de
threads)
1
2
3
4
5
Processa
Processa
Processa
Processa
Processa
ForEach
![Page 32: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/32.jpg)
Parallel LINQ– .ForAll(Action<T>) = foreach em paralelo (sem merge de
threads)
1
2
3
4
5
Processa
Processa
Processa
Processa
Processa
ForAll
![Page 33: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/33.jpg)
Parallel LINQ– Tratamento de múltiplas excepções - AggregateException
1
2
3
4
Processa
Processa
Processa
Processa
![Page 34: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/34.jpg)
Parallel LINQ– Tratamento de múltiplas excepções - AggregateException
1
2
3
4
Processa
Processa
Processa
Processa
AggregateException
![Page 35: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/35.jpg)
LINQ – Conclusões– Type Safe
– Sintaxe comum sobre várias (qualquer) data source
– Altamente Extensível (desde simples a extremamente complexo)
– Funcionalidades de suporte podem ser usadas individualmente
– PLINQ evolui para Multi-Processador
![Page 36: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/36.jpg)
LINQs Query Comprehensions
– http://msdn.microsoft.com/en-us/magazine/cc163378.aspx101 LINQ Samples
– http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspxLINQ to XML
– http://msdn.microsoft.com/en-us/library/bb387098.aspxLINQ to SQL
– http://msdn.microsoft.com/en-us/library/bb425822.aspxLINQ to SQL Debug Visualizer
– http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspxParallel LINQ
– http://msdn.microsoft.com/en-us/library/dd460688.aspx
![Page 37: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/37.jpg)
DownloadDownload do código-fonte das demonstrações desta apresentação:
– http://netponto.codeplex.com/releases/view/46929
![Page 38: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/38.jpg)
Sérgio Amendoeira
• Arquitecto de Soluções na Tecnocom Portugal. • Responsável pelo desenvolvimento de diversas
Arquitecturas de Referência para aplicações da Tecnocom em tecnologias Microsoft.
• Membro do Grupo de Arquitectura de Software (GASP)
• Speaker nos eventos TechDays (2005 e 2007, 2010).
![Page 40: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/40.jpg)
Patrocinadores desta reunião
Paulo Morgado
![Page 41: Tudo o que sempre quis saber sobre o LINQ](https://reader030.vdocuments.mx/reader030/viewer/2022020717/554ebca8b4c9053c4b8b46dc/html5/thumbnails/41.jpg)
Próximas reuniões presenciais
• 15/05/2010 - Maio• 19/06/2010 - Junho• 26/06/2010 - Junho (Porto?)• 10/07/2010 - Julho• 14/08/2010 - Agosto
Reserva estes dias na agenda! :)