SlideShare a Scribd company logo
LINQ edoltreVerso lospazioprofondo(dove vi aspetta Raf  )Ricci Gian Maria:alkampfer@nablasoft.com
LINQ in un eventosul C# 4.0?Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQRinforzare le basi non fa mai maleIniziamo sul leggero, perchè poi c’è Raf 
AnonymousdelegateLambda expressionSebbene 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 ……..Anonymousdelegates
LINQVedremo 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 LINQPossibilegenesi di LINQ
Lambda expressionLambda expressionA 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 è solamenteSyntactic Sugar
Ma…….Magia o trucco?Lambda expression
Lambda expressionLambda expressionQuesta «magia» accade perché il compilatore ha due modi distinti di rappresentare una lambda
Funzione anonima
ExpressionTree: ovvero la rappresentazione dell’espressione con oggetti .NET organizzati in un normale «expressiontree»Expression TreeLambda expression+5 * 1 + 44*51
Expression Tree .NETLambda expressionQuella appena vista è una ExpressionTree relativa ad una espressione numericaUna ExpressionTree 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 ExpressionTree.
Expression Tree .NETLambda expressiono.Customer.Name.StartsWith("A")LambdaEsprime la chiamata a funzione StartsWith, necessita di un oggetto su cui chiamarlo e di una serie di parametri, in questo caso la stringa “A”CallMember AccessConstantL’unico parametro del metodo StartsWith()Nel primo ramo si indica l’oggetto su cui va invocata la funzione.Member AccessAccesso al membro Name dell’oggetto CustomerAccesso al membro Customer dell’oggetto Order.ParameterIl parametro della query, l’ordine o.
Expression<Func<int, bool>>  lambda =   num => num < 5;Expression Trees
Chi usa le Expression TreeLambda expressionI primi utilizzatori delle ExpressionTree sono i Provider LINQUn provider LINQ implementa la IQueryable<T> per tradurre una query LINQ in un qualcosa comprensibile alla sorgenteES. LINQ to NHibernate converte in query NHibernate, LINQ to LDAP converte in query LDAP, Etc.
Provider LINQLambda expressionUn provider linq deve quindi solamente tradurre una ExpressionTree in qualche cos’altroExpTreeSQLHQLLDAPLINQ QUERYCompilerProvider
Provider LINQLambda expressionÈ 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 LIKEAlcuni 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
Expression Trees - Le usero mai?
StaticReflectionLambda expressionLa static reflection è un uso “intelligente” degli expression tree per evitare reflectionStaticReflection
Compilazione di expressionTreeLambda expressionAccedere tramite reflection ad un metodo può essere lento.
Si possono usare le Expression Tree per generare una funzione dinamicamenteCompilazione di expressionTreeLambda expression
Compilazione di Expression Tree
OrderBydinamici su LINQLambda expressionSi ha un repository basato su IQueryable<T>
Si vuole ordinare per una proprietà che è passata come stringa

More Related Content

PPTX
Deep diving C# 4 (Raffaele Rialdi)
PPTX
Funzioni
PPTX
Reflection in C#
DOCX
C# Collection classes
PPTX
Costruire app per WinPhone, iOS e Android con C# e Xamarin
PDF
MS c# - programming with.net framework - Scheda corso LEN
PPT
Advanced c#
PPTX
Inversion of Control @ CD2008
Deep diving C# 4 (Raffaele Rialdi)
Funzioni
Reflection in C#
C# Collection classes
Costruire app per WinPhone, iOS e Android con C# e Xamarin
MS c# - programming with.net framework - Scheda corso LEN
Advanced c#
Inversion of Control @ CD2008

More from Gian Maria Ricci (20)

PPTX
Se non sviluppo codice non sto lavorando
PPTX
Gestire la qualità del codice con Visual Studio, SonarQube ed Azure Devops
PPTX
Migrare da un VCS centralizzato a Git
PPTX
Real World Build + Release automation in Azure DevOps
PPTX
Gestire i rilasci automatici con azure devops
PPTX
Build and release in code with azure devops pipelines
PPTX
Azure Pipeline in salsa yaml
PPTX
Git gitflow pull requests in devops focused teams
PPTX
Distribute your code with NUget and build vNext
PPTX
Manage your environment with DSC
PPTX
Introduction to Application insights
PPTX
Git branching model
PPTX
Deploy applications with TFS Build
PPTX
TFS - Quale source control
PPTX
Branch model in Git
PPTX
Introduction to Visual Studio Online
PPTX
Git si o Git No
PPTX
PPTX
Come Organizzare il proprio Team Project
PPTX
Git Perchè Usarlo
Se non sviluppo codice non sto lavorando
Gestire la qualità del codice con Visual Studio, SonarQube ed Azure Devops
Migrare da un VCS centralizzato a Git
Real World Build + Release automation in Azure DevOps
Gestire i rilasci automatici con azure devops
Build and release in code with azure devops pipelines
Azure Pipeline in salsa yaml
Git gitflow pull requests in devops focused teams
Distribute your code with NUget and build vNext
Manage your environment with DSC
Introduction to Application insights
Git branching model
Deploy applications with TFS Build
TFS - Quale source control
Branch model in Git
Introduction to Visual Studio Online
Git si o Git No
Come Organizzare il proprio Team Project
Git Perchè Usarlo
Ad

Linq ed oltre

  • 1. LINQ edoltreVerso lospazioprofondo(dove vi aspetta Raf  )Ricci Gian Maria:alkampfer@nablasoft.com
  • 2. LINQ in un eventosul C# 4.0?Gran parte delle funzionalità delle parallel libraries è comunque basata su LINQRinforzare le basi non fa mai maleIniziamo sul leggero, perchè poi c’è Raf 
  • 3. AnonymousdelegateLambda expressionSebbene gli anonymous delegate siano una funzionalità del 2.0 alcuni concetti sono necessari per LINQ
  • 4. È importante capire bene cosa sia una closure
  • 5. Grazie alle closure è possibile facilitare l’operazione di Currying [schönfinkeling] (cambio di arità di una funzione)
  • 6. Che brutte parole ……..Anonymousdelegates
  • 7. LINQVedremo ora una presentazione di LINQ collegata ad un ripasso delle funzionalità di C# 3.0
  • 8. Quello che verrà fatto è mostrare come le nuove caratteristiche di C# 3.0 sono state introdotte principalmente al servizio di LINQPossibilegenesi di LINQ
  • 9. Lambda expressionLambda expressionA lambda expression is an anonymous function that can contain expressions and statements, and can be used to create delegates or expression tree types.
  • 12. Lambda expressionLambda expressionQuesta «magia» accade perché il compilatore ha due modi distinti di rappresentare una lambda
  • 14. ExpressionTree: ovvero la rappresentazione dell’espressione con oggetti .NET organizzati in un normale «expressiontree»Expression TreeLambda expression+5 * 1 + 44*51
  • 15. Expression Tree .NETLambda expressionQuella appena vista è una ExpressionTree relativa ad una espressione numericaUna ExpressionTree 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 ExpressionTree.
  • 16. Expression Tree .NETLambda expressiono.Customer.Name.StartsWith("A")LambdaEsprime la chiamata a funzione StartsWith, necessita di un oggetto su cui chiamarlo e di una serie di parametri, in questo caso la stringa “A”CallMember AccessConstantL’unico parametro del metodo StartsWith()Nel primo ramo si indica l’oggetto su cui va invocata la funzione.Member AccessAccesso al membro Name dell’oggetto CustomerAccesso al membro Customer dell’oggetto Order.ParameterIl parametro della query, l’ordine o.
  • 17. Expression<Func<int, bool>> lambda = num => num < 5;Expression Trees
  • 18. Chi usa le Expression TreeLambda expressionI primi utilizzatori delle ExpressionTree sono i Provider LINQUn provider LINQ implementa la IQueryable<T> per tradurre una query LINQ in un qualcosa comprensibile alla sorgenteES. LINQ to NHibernate converte in query NHibernate, LINQ to LDAP converte in query LDAP, Etc.
  • 19. Provider LINQLambda expressionUn provider linq deve quindi solamente tradurre una ExpressionTree in qualche cos’altroExpTreeSQLHQLLDAPLINQ QUERYCompilerProvider
  • 20. Provider LINQLambda expressionÈ 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 LIKEAlcuni 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
  • 21. Expression Trees - Le usero mai?
  • 22. StaticReflectionLambda expressionLa static reflection è un uso “intelligente” degli expression tree per evitare reflectionStaticReflection
  • 23. Compilazione di expressionTreeLambda expressionAccedere tramite reflection ad un metodo può essere lento.
  • 24. Si possono usare le Expression Tree per generare una funzione dinamicamenteCompilazione di expressionTreeLambda expression
  • 26. OrderBydinamici su LINQLambda expressionSi ha un repository basato su IQueryable<T>
  • 27. Si vuole ordinare per una proprietà che è passata come stringa
  • 28. L’operatore OrderBy di LINQ non accetta una stringa, ma una Expression TreeOrderBydinamici su LINQLambda expressionLa soluzione è generare run-time l’expressiontree che si attenderebbe la OrderBy
  • 29. Ad esempio scrivendo customers.OrderByProperty("Name", false) si deve generare la stessa Expression che si avrebbe scrivendo customers.OrderBy(c => c.Name)Order by dinamici su LINQ
  • 30. ConclusioniLambda expressionUna buona padronanza delle ExpressionTree può aiutare a risolvere problemi “quotidiani”
  • 31. Conoscere le ExpressionTree non è quindi solo appannaggio di chi scrive un provider LINQ
  • 32. Grazie alle Lambda Expression anche in C# si può adottare una programmazione in stile «funzionale»?
  • 33. CODE