Linq ed oltre

1,240 views
1,163 views

Published on

Slide e codice della presentazione del 18° workshop dotnetmarche

Published in: Technology
2 Comments
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
1,240
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
33
Comments
2
Likes
0
Embeds 0
No embeds

No notes for slide

Linq ed oltre

  1. 1. LINQ edoltre<br />Verso lospazioprofondo<br />(dove vi aspetta Raf  )<br />Ricci Gian Maria:alkampfer@nablasoft.com<br />
  2. 2. LINQ in un eventosul C# 4.0?<br />Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQ<br />Rinforzare le basi non fa mai male<br />Iniziamo sul leggero, perchè poi c’è Raf <br />
  3. 3. Anonymousdelegate<br />Lambda expression<br /><ul><li>Sebbene gli anonymous delegate siano una funzionalità del 2.0 alcuni concetti sono necessari per LINQ
  4. 4. È importante capire bene cosa sia una closure
  5. 5. Grazie alle closure è possibile facilitare l’operazione di Currying [schönfinkeling] (cambio di arità di una funzione)
  6. 6. Che brutte parole ……..</li></li></ul><li>Anonymousdelegates<br />
  7. 7. LINQ<br /><ul><li>Vedremo ora una presentazione di LINQ collegata ad un ripasso delle funzionalità di C# 3.0
  8. 8. Quello che verrà fatto è mostrare come le nuove caratteristiche di C# 3.0 sono state introdotte principalmente al servizio di LINQ</li></li></ul><li>Possibilegenesi di LINQ<br />
  9. 9. Lambda expression<br />Lambda expression<br /><ul><li>A lambda expression is an anonymous function that can contain expressions and statements, and can be used to create delegates or expression tree types.
  10. 10. All’apparenza è solamenteSyntactic Sugar
  11. 11. Ma…….</li></li></ul><li>Magia o trucco?<br />Lambda expression<br />
  12. 12. Lambda expression<br />Lambda expression<br /><ul><li>Questa «magia» accade perché il compilatore ha due modi distinti di rappresentare una lambda
  13. 13. Funzione anonima
  14. 14. ExpressionTree: ovvero la rappresentazione dell’espressione con oggetti .NET organizzati in un normale «expressiontree»</li></li></ul><li>Expression Tree<br />Lambda expression<br />+<br />5 * 1 + 4<br />4<br />*<br />5<br />1<br />
  15. 15. Expression Tree .NET<br />Lambda expression<br />Quella appena vista è una ExpressionTree relativa ad una espressione numerica<br />Una ExpressionTree in .NET è sostanzialmente più complessa, perché deve rappresentare accesso ad oggetti, chiamata a metodi, Etc.<br />Una lambda MultiRiga non può essere convertita dal compilatore in ExpressionTree.<br />
  16. 16. Expression Tree .NET<br />Lambda expression<br />o.Customer.Name.StartsWith("A")<br />Lambda<br />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”<br />Call<br />Member Access<br />Constant<br />L’unico parametro del metodo StartsWith()<br />Nel primo ramo si indica l’oggetto su cui va invocata la funzione.<br />Member Access<br />Accesso al membro Name dell’oggetto Customer<br />Accesso al membro Customer dell’oggetto Order.<br />Parameter<br />Il parametro della query, l’ordine o.<br />
  17. 17. Expression<Func<int, bool>> <br /> lambda = num => num < 5;<br />Expression Trees<br />
  18. 18. Chi usa le Expression Tree<br />Lambda expression<br />I primi utilizzatori delle ExpressionTree sono i Provider LINQ<br />Un provider LINQ implementa la IQueryable<T> per tradurre una query LINQ in un qualcosa comprensibile alla sorgente<br />ES. LINQ to NHibernate converte in query NHibernate, LINQ to LDAP converte in query LDAP, Etc.<br />
  19. 19. Provider LINQ<br />Lambda expression<br />Un provider linq deve quindi solamente tradurre una ExpressionTree in qualche cos’altro<br />ExpTree<br />SQL<br />HQL<br />LDAP<br />LINQ QUERY<br />Compiler<br />Provider<br />
  20. 20. Provider LINQ<br />Lambda expression<br />È grazie al compilatore che produce una ExpressionTree che il provider per EF/NH/SQL quando vede una chiamata al metodo String.StartsWith() decide di generare una query SQL con operatore LIKE<br />Alcuni provider, come il LINQ to XML sono invece implementati tramite IEnumerable<T><br />Se siete interessati a come si implementa un provider LINQ  magari un prossimo WS<br />
  21. 21. Expression Trees - Le usero mai? <br />
  22. 22. StaticReflection<br />Lambda expression<br /><ul><li>La static reflection è un uso “intelligente” degli expression tree per evitare reflection</li></li></ul><li>StaticReflection<br />
  23. 23. Compilazione di expressionTree<br />Lambda expression<br /><ul><li>Accedere tramite reflection ad un metodo può essere lento.
  24. 24. Si possono usare le Expression Tree per generare una funzione dinamicamente</li></li></ul><li>Compilazione di expressionTree<br />Lambda expression<br />
  25. 25. Compilazione di Expression Tree<br />
  26. 26. OrderBydinamici su LINQ<br />Lambda expression<br /><ul><li>Si ha un repository basato su IQueryable<T>
  27. 27. Si vuole ordinare per una proprietà che è passata come stringa
  28. 28. L’operatore OrderBy di LINQ non accetta una stringa, ma una Expression Tree</li></li></ul><li>OrderBydinamici su LINQ<br />Lambda expression<br /><ul><li>La soluzione è generare run-time l’expressiontree che si attenderebbe la OrderBy
  29. 29. Ad esempio scrivendo customers.OrderByProperty("Name", false) si deve generare la stessa Expression che si avrebbe scrivendo customers.OrderBy(c => c.Name)</li></li></ul><li>Order by dinamici su LINQ <br />
  30. 30. Conclusioni<br />Lambda expression<br /><ul><li>Una buona padronanza delle ExpressionTree può aiutare a risolvere problemi “quotidiani”
  31. 31. Conoscere le ExpressionTree non è quindi solo appannaggio di chi scrive un provider LINQ
  32. 32. Grazie alle Lambda Expression anche in C# si può adottare una programmazione in stile «funzionale»</li></li></ul><li>?<br />
  33. 33. CODE<br />

×