tudo o que sempre quis saber sobre o linq

Post on 10-May-2015

3.306 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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

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

Introdução

tegratedLINanguage

Query

Introdução

tegratedLINanguage

Query

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).

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

top related