View
3.305
Download
4
Category
Preview:
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.
Citation preview
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
Recommended