View
219
Download
0
Category
Preview:
Citation preview
Applied Linq
Putting Linq to work
Introducing…
• Class-A• Kennisprovider Microsoft development• Training• Coaching• http://www.class-a.nl
• Alex Thissen• Trainer/coach• http://blog.alexthissen.nl
Agenda
• About Linq and queries• Query providers and APIs• What it means to apply Linq
– Language and code– Query execution– Recommendations– Architecture
• Beyond Linq• Demos• Questions and discussion
Dim query = From c In customers _ Where c.Orders.Count > 100 _ Order By c.CompanyName Descending _ Select c
Introducing Linq
• Uniform way to write queries over data• Linq is about query keywords
– Built into new languages C# 3.0 and VB 9.0• Linq is about query operators
– 40+ standard query operators are defined– Methods that operate in queries or act on its results
var query = from c in customers where c.Orders.Count > 100 orderby c.CompanyName descending select c;
About Linq queries
• Expressed in terms of CLR types– Objects that might or might not exist in-memory
• Linq queries are not SQL queries at all• Compositional and hierarchical by nature
– Arbitrary nesting of queries– Additional operators can be applied to query
• Declarative instead of imperative– Tell what you want, not how– How is up to underlying implementation
Writing queries
• Learn the keywords and operators– Not all operators have corresponding keywords or
language integration– Number of keywords may vary per language
• Some parts must be written with operators– Usually exposes lambda expressions
• Queries can be done without keywords– Explicit dot notation (what compiler creates)– Sometimes FLWOS is overkill
Demos
Getting familiar with Linq queries– Query operations: selection, projection, grouping– Using keywords and operators
Sources of data
• Your data must come from somewhere
1. In-memory CLR objects
2. Database
3. XML
4. Other repositories: registry, Active Directory, …• Various flavors of Linq disclose certain type of
data• Query syntax does not change per source
– Set of keywords and operators available might be different
Linq to XML
• Power of Linq brought to data in XML format
1. Perform queries over XML data
2. New element-centric API to manipulate XML• Faster alternative to System.Xml DOM API
3. Functional construction of XML data with query expressions
Linq to SQL
• Generates object model to represent data• Mapping of CLR types to database tables
– Object/Relational Mapping (OR/M) technology– 1:1 relationships between objects and tables– Translates Linq queries to SQL statements
• Builds on ADO.NET and .NET Transactions• Persistence services
– Automatic change tracking and identity management of objects
– Updates by SQL statements or stored procedures
Two kinds of Linq
Enumerable types Queryable types
Execution Local in-memory Usually remote
Implementation Iterators using yield return
Expression tree parsing
Interface IEnumerable<T> IQueryable<T>
Providers Linq to Objects
Linq to SQL Entities (after 3.5)
Other APIs Linq to XML DataSets
Query providers
• Out-of-the-box providers in .NET 3.5:– Linq to Objects– Linq to SQL
• Sources in query determine query providers– Affects keywords and operators you can use
• Query providers can translate Linq queries to some implementation
• Most providers come with Linq-enabled APIs– New object models to work with data– Linq to Objects has several: Linq to XML, DataSets
Demo
Linq applied
Scenario: WCF services using untyped Messages
WPF ApplicationWPF Application WCF ServiceWCF Service
WCF proxyWCF proxy
SOAP messages
Linq to XML APILinq to XML API
Linq to SQLLinq to SQL
Linq to XMLLinq to XML
New language features C# and VB
• Linq keywords• Extension methods• Lambda expressions• Local variable inference• Object and collection initializers• Anonymous types
• Automatic properties• Partial methods
newnew
Visual Basic 9.0
• Deep XML support– Express XPath axes with XML properties
– Allows XML literals to appear inside of code
root.<Customer> Direct child elementscustomer.@CompanyID Attribute selectiondoc...<description> All descendants
Dim fragment As XElement = _ <company> <city>Hedel</city> </company>
Visual Basic 9.0
– Gives you “expression holes” inside XML literals
• Additional keywords• More freedom on order of keywords
Dim query = _ From c In doc...<Customers> _ Select <customer ID=<%= c.@CustomerID %> > <%= customer.<Name> %> phone:<%= customer...<Phone>(0) %> </customer>
Demo
Visual Basic – WCF sample revisited– Deep XML support
Deferred execution
• Most Linq query providers are implemented using lazy evaluation
• Composed query expressions do not execute immediately
• Queries only execute when necessary– Performing an iteration over resultset– Using extension methods ToArray, ToList,
ToLookup, ToDictionary– Using specific query operators, such as
aggregates and set operators
More on deferred execution
• Before execution queries can still be changed or expanded– Adding additional sequence operators, such as
Distinct, Skip, Take– Manipulating expression tree
• Expression trees are immutable• Reference assignments take deep tree copies
Changes to way you write code
• Declarative– Far less looping constructs visible– Easier to read and to maintain
• Methods returning query or its results– Remember deferred execution– Force execution of query– Hand over query for further manipulation– Query reuse
Linq and architecture
System.Data.Linq
Architecture recommendations
• Find out where and how your queries execute– Moment of execution– Local versus remote execution– Physical place/tier of query execution
• Keep queries inside assemblies– Do not pass query expressions between layers
• Anonymous types shouldn’t be return values– Think about important types up front– Use projections wisely
Other recommendations
• Learn:– to write queries with and without keywords– new language features
• Use whitepapers as reference– Translation of query keywords to operators– Evaluation details of operators
• Do not overuse or abuse var keyword– Decreases readability and stops you from thinking:
if you know exact type, specify it– It sometimes takes more keystrokes
Runtimes and frameworks for Linq
Linq to .NET FX 3.5
Compact FX 3.5 Silverlight 1.1
Objects X X X
SQL X
Entities X
DataSets X X
XML X X X
pro
vid
ers
APIs
* ADO.NET Entity Framework released out of bounds with .NET FX 3.5
*
Beyond .NET FX 3.5
• ADO.NET Entity Framework – Microsoft’s long-term vision on data– Brings query provider Linq to Entities
• Parallel Linq (PLinq)– Passes parts of query to different cores in
multicore/multiproc machine• Community query providers for Linq:
– Linq to Amazon, LDAP, SharePoint, NHibernate, MySql, Flickr, … and more (to come)
• Linq 2.0
Expanding on Linq
• Linq-enable your existing API’s– Specifically for in-memory queries– Create extension methods that return an
IEnumerable<T> object • Write your own query provider
– Implement IQueryable<T>– Parse expression trees and translate nodes to
different code or query language
References
• Linq home page• Future versions of
– C#, Visual Basic, Visual Studio
• Recommended reading– Linq to XML beta 1 docs– Future: Linq 2.0, PLinq
• Downloads– Linq May 2006 CTP (for Visual Studio 2005)– Visual Studio Orcas April 2007 Beta 1 and C#, VB samples– Reflector 5.0
Blogs
• Microsoft Teams– C#– VB– ADO.NET
• Individuals on Linq– General: Oakleaf Systems, Wes Dyer, Jomo
Fisher– SQL: Mike Taulty– XML: Eric White
Summary
• Linq is about query keywords and operators
• Linq will change way you write your code
• Linq to XML might be more important than you think
• Is VB a better query language than C#?
• Linq is extensible
Questions?
?
Recommended