LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque...

27
LINQ ed oltre Verso lo spazio profondo (dove vi aspetta Raf ) Ricci Gian Maria:[email protected]

Transcript of LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque...

Page 1: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

LINQ ed oltreVerso lo spazio profondo

(dove vi aspetta Raf )

Ricci Gian Maria:[email protected]

Page 2: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

LINQ in un evento sul C# 4.0?

• Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ

• Rinforzare le basi non fa mai male• Iniziamo sul leggero, perchè poi c’è

Raf

Page 3: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

• Sebbene gli anonymous delegate siano una funzionalità del 2.0 alcuni concetti sono necessari per LINQ

• È importante capire bene cosa sia una closure• Grazie alle closure è possibile facilitare

l’operazione di Currying [schönfinkeling] (cambio di arità di una funzione)

• Che brutte parole ……..

Lambda expressionAnonymous delegate

Page 4: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Anonymous delegates

Page 5: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

LINQ

• Vedremo ora una presentazione di LINQ collegata ad un ripasso delle funzionalità di C# 3.0

• Quello che verrà fatto è mostrare come le nuove caratteristiche di C# 3.0 sono state introdotte principalmente al servizio di LINQ

Page 6: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Possibile genesi di LINQ

Page 7: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

• A lambda expression is an anonymous function that can contain expressions and statements, and can be used to create delegates or expression tree types.

• All’apparenza è solamente Syntactic Sugar • Ma…….

Lambda expressionLambda expression

Page 8: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionMagia o trucco?

Page 9: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

• Questa «magia» accade perché il compilatore ha due modi distinti di rappresentare una lambda• Funzione anonima• Expression Tree: ovvero la rappresentazione

dell’espressione con oggetti .NET organizzati in un normale «expression tree»

Lambda expressionLambda expression

Page 10: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionExpression Tree

+5 * 1 + 4

*

5 1

4

Page 11: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionExpression Tree .NET

• Quella appena vista è una Expression Tree relativa ad una espressione numerica

• Una Expression Tree in .NET è sostanzialmente più complessa, perché deve rappresentare accesso ad oggetti, chiamata a metodi, Etc.

• Una lambda MultiRiga non può essere convertita dal compilatore in Expression Tree.

Page 12: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionExpression Tree .NET

• o.Customer.Name.StartsWith("A")Lambda

Call

Member Access

Member Access

Parameter

Constant

Esprime la chiamata a funzione StartsWith, necessita di un oggetto su cui chiamarlo e di una serie di parametri, in questo caso la stringa “A”

Nel primo ramo si indica l’oggetto su cui va invocata la funzione.

Il parametro della query, l’ordine o.

Accesso al membro Customer dell’oggetto Order.

Accesso al membro Name dell’oggetto Customer

L’unico parametro del metodo StartsWith()

Page 13: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Expression Trees

Expression<Func<int, bool>> lambda = num => num < 5;

Page 14: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionChi usa le Expression Tree

• I primi utilizzatori delle Expression Tree sono i Provider LINQ

• Un provider LINQ implementa la IQueryable<T> per tradurre una query LINQ in un qualcosa comprensibile alla sorgente

• ES. LINQ to NHibernate converte in query NHibernate, LINQ to LDAP converte in query LDAP, Etc.

Page 15: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionProvider LINQ

• Un provider linq deve quindi solamente tradurre una Expression Tree in qualche cos’altro

LINQ QUERY

Exp TreeCompiler Provider SQL

HQLLDAP

Page 16: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionProvider LINQ

• È grazie al compilatore che produce una Expression Tree che il provider per EF/NH/SQL quando vede una chiamata al metodo String.StartsWith() decide di generare una query SQL con operatore LIKE

• Alcuni provider, come il LINQ to XML sono invece implementati tramite IEnumerable<T>

• Se siete interessati a come si implementa un provider LINQ magari un prossimo WS

Page 17: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Expression Trees - Le usero mai?

Page 18: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

• La static reflection è un uso “intelligente” degli expression tree per evitare reflection

Lambda expressionStatic Reflection

Page 19: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Static Reflection

Page 20: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

• Accedere tramite reflection ad un metodo può essere lento.

• Si possono usare le Expression Tree per generare una funzione dinamicamente

Lambda expressionCompilazione di expressionTree

Page 21: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionCompilazione di expressionTree

Page 22: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Compilazione di Expression Tree

Page 23: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionOrderBy dinamici su LINQ

• Si ha un repository basato su IQueryable<T>• Si vuole ordinare per una proprietà che è

passata come stringa• L’operatore OrderBy di LINQ non accetta una

stringa, ma una Expression Tree

Page 24: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionOrderBy dinamici su LINQ

• La soluzione è generare run-time l’expression tree che si attenderebbe la OrderBy

• Ad esempio scrivendo customers.OrderByProperty("Name", false) si deve generare la stessa Expression che si avrebbe scrivendo customers.OrderBy(c => c.Name)

Page 25: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Order by dinamici su LINQ

Page 26: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

Lambda expressionConclusioni

• Una buona padronanza delle Expression Tree può aiutare a risolvere problemi “quotidiani”

• Conoscere le Expression Tree non è quindi solo appannaggio di chi scrive un provider LINQ

• Grazie alle Lambda Expression anche in C# si può adottare una programmazione in stile «funzionale»

Page 27: LINQ in un evento sul C# 4.0? Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ Rinforzare le basi non fa mai male Iniziamo.

?