tudo o que sempre quis saber sobre o linq

42
http://netpont o.org 10ª Reunião Presencial – 15/05/2010 Tudo o que sempre quis saber sobre LINQ Sérgio Amendoeira

Upload: comunidade-netponto

Post on 10-May-2015

3.306 views

Category:

Technology


4 download

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

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

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

Agenda

• Introdução• LINQ - Como funciona?• LINQ sobre objectos em memória• LINQ sobre dados externos• LINQ to Anything• Parallel LINQ

Page 5: Tudo o que sempre quis saber sobre o LINQ

Introdução

tegratedLINanguage

Query

Page 6: Tudo o que sempre quis saber sobre o LINQ

Introdução

tegratedLINanguage

Query

Page 7: Tudo o que sempre quis saber sobre o LINQ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 41: Tudo o que sempre quis saber sobre o LINQ

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! :)