tudo o que sempre quis saber sobre o linq
Post on 10-May-2015
3.305 Views
Preview:
DESCRIPTION
TRANSCRIPT
http://netponto.org10ª Reunião Presencial – 15/05/2010
Tudo o que sempre quis saber sobre LINQSérgio Amendoeira
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).
Agenda
• Introdução• LINQ - Como funciona?• LINQ sobre objectos em memória• LINQ sobre dados externos• LINQ to Anything• Parallel LINQ
Também disponível em vídeo...
Assista!http://www.vimeo.com/15022564
Introdução• Qual a linguagem mais utilizada para realizar queries sobre dados
relacionais?
T-SQL
Select Bares.NomeFrom BaresWhere Localidade = ‘Lisboa’
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?
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
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
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
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
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
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
LINQ (Objectos em Memória)
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
LINQ to SQL
LINQ +DataContext (ORM)
- Suporte para LINQ (IQueryable<T>)- Designer Gráfico- Object Tracking- Lazy Loading- Insert / Update / Delete
LINQ to SQL – Como funciona?
bar => bar.Localidade == ´Lisboa’ bar => bar.Nome Lambdas como
ExpressionTrees
==
. ’Lisboa’
bar Localidade
.
bar Nome
LINQ to SQL – Como funciona?
Table<T>
Expression Trees
var query = from bar in contexto.Bars select bar
query.ToList()
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
LINQ to SQL
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
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
LINQ to Anything (IEnumerable)
Demo
Código-fonte disponível para download:http://netponto.codeplex.com/releases/view/46929
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– ...
Parallel LINQDados Em Memória
- ParallelQuery<T>
var baresEmLisboa = from bar in listaBareswhere bar.Localidade == “Lisboa”select bar.Nome;
var baresEmLisboa = from bar in listaBares.AsParallel()where bar.Localidade == “Lisboa”select bar.Nome;
Parallel LINQDados Em Memória
- ParallelQuery<T>
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()
Parallel LINQ– Saltar entre processamento Paralelo e Sequencial
ParallelQuery<T> IEnumerable<T>
.AsSequential()
.AsParallel()
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
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
Parallel LINQ– FullBuffered
1
2
3
4
5
6
7
8
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Processa
Devolve Resultados
Parallel LINQ– .ForAll(Action<T>) = foreach em paralelo (sem merge de
threads)
1
2
3
4
5
Processa
Processa
Processa
Processa
Processa
ForEach
Parallel LINQ– .ForAll(Action<T>) = foreach em paralelo (sem merge de
threads)
1
2
3
4
5
Processa
Processa
Processa
Processa
Processa
ForAll
Parallel LINQ– Tratamento de múltiplas excepções - AggregateException
1
2
3
4
Processa
Processa
Processa
Processa
Parallel LINQ– Tratamento de múltiplas excepções - AggregateException
1
2
3
4
Processa
Processa
Processa
Processa
AggregateException
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
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
DownloadDownload do código-fonte das demonstrações desta apresentação:
– http://netponto.codeplex.com/releases/view/46929
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).
Patrocinadores desta reunião
Paulo Morgado
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! :)
Obrigado!
Sérgio Amendoeirasergio.amendoeira@tecnocom.pt
top related