La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Verso lo spazio profondo

Presentazioni simili


Presentazione sul tema: "Verso lo spazio profondo"— Transcript della presentazione:

1 Verso lo spazio profondo
LINQ ed oltre Verso lo spazio profondo (dove vi aspetta Raf  ) Ricci Gian

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 sul leggero, perchè poi c’è Raf 

3 Lambda expression Anonymous delegate
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 ……..

4 Anonymous delegates

5 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

6 Possibile genesi di LINQ

7 Lambda expression Lambda expression
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…….

8 Lambda expression Magia o trucco?

9 Lambda expression Lambda expression
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»

10 Lambda expression Expression Tree + 5 * 1 + 4 * 4 5 1

11 Lambda expression Expression 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.

12 Lambda expression Expression Tree .NET
o.Customer.Name.StartsWith("A") Lambda 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” Call Member Access Constant L’unico parametro del metodo StartsWith() Nel primo ramo si indica l’oggetto su cui va invocata la funzione. Member Access Accesso al membro Name dell’oggetto Customer Accesso al membro Customer dell’oggetto Order. Parameter Il parametro della query, l’ordine o.

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

14 Chi usa le Expression Tree
Lambda expression Chi 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.

15 Lambda expression Provider LINQ
Un provider linq deve quindi solamente tradurre una Expression Tree in qualche cos’altro Exp Tree SQL HQL LDAP LINQ QUERY Compiler Provider

16 Lambda expression Provider 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

17 Expression Trees - Le usero mai?

18 Lambda expression Static Reflection
La static reflection è un uso “intelligente” degli expression tree per evitare reflection

19 Static Reflection

20 Compilazione di expressionTree
Lambda expression Compilazione di expressionTree Accedere tramite reflection ad un metodo può essere lento. Si possono usare le Expression Tree per generare una funzione dinamicamente

21 Compilazione di expressionTree
Lambda expression Compilazione di expressionTree

22 Compilazione di Expression Tree

23 OrderBy dinamici su LINQ
Lambda expression OrderBy 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

24 OrderBy dinamici su LINQ
Lambda expression OrderBy 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)

25 Order by dinamici su LINQ

26 Lambda expression Conclusioni
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»

27 ?

28 CODE


Scaricare ppt "Verso lo spazio profondo"

Presentazioni simili


Annunci Google