LINQ Providers Or why.NET rules, and Java doesn’t Branimir Giurov SofiaDev.org UG Lead, C# MVP Freelance Software Developer
ContentsContents typeof(linq)typeof(linq) How does it work?How does it work? Lambda, extension methods, iteratorsLambda, extension methods, iterators typeof(linq)typeof(linq) How does it work?How does it work? Lambda, extension methods, iteratorsLambda, extension methods, iterators
typeof(linq)typeof(linq)
Objects <book> </book> XML.NET Language Integrated Query C# 3.0 VB 9.0 Others… Relational LINQ to Objects LINQ to SQL LINQ to XML LINQ to Entities LINQ to Datasets
typeof(linq)typeof(linq) LINQ to ObjectsLINQ to Objects LINQ to SQLLINQ to SQL LINQ to XMLLINQ to XML LINQ to DatasetsLINQ to Datasets LINQ to EntitiesLINQ to Entities LINQ to Windows SearchLINQ to Windows Search LINQ to GoogleLINQ to Google LINQ to SharepointLINQ to Sharepoint LINQ to nHibernateLINQ to nHibernate LINQ to ObjectsLINQ to Objects LINQ to SQLLINQ to SQL LINQ to XMLLINQ to XML LINQ to DatasetsLINQ to Datasets LINQ to EntitiesLINQ to Entities LINQ to Windows SearchLINQ to Windows Search LINQ to GoogleLINQ to Google LINQ to SharepointLINQ to Sharepoint LINQ to nHibernateLINQ to nHibernate
LINQ to Objects Query language over collections of objectsQuery language over collections of objects Standard SQL-like set of query operators, including joins and groupingStandard SQL-like set of query operators, including joins and grouping New query operators can be added, fully extensible (extension methods)New query operators can be added, fully extensible (extension methods) Intellisense and compiler syntax checking support in Visual StudioIntellisense and compiler syntax checking support in Visual Studio Query language over collections of objectsQuery language over collections of objects Standard SQL-like set of query operators, including joins and groupingStandard SQL-like set of query operators, including joins and grouping New query operators can be added, fully extensible (extension methods)New query operators can be added, fully extensible (extension methods) Intellisense and compiler syntax checking support in Visual StudioIntellisense and compiler syntax checking support in Visual Studio
LINQ to Objects How to query an array of int?How to query an array of int? public void Linq1() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var lowNums = from n in numbers where n < 5 select n; Console.WriteLine("Numbers < 5:"); foreach (var x in lowNums) { Console.WriteLine(x); } }
LINQ to SQL Write queries in any.NET language to retrieve and manipulate data from SQLWrite queries in any.NET language to retrieve and manipulate data from SQL Use FK constraints for defining relations of data without joinsUse FK constraints for defining relations of data without joins Join in code on any column that has no FK definedJoin in code on any column that has no FK defined Use FK’s to query/modify data in SQL DBUse FK’s to query/modify data in SQL DB Call SubmitChanges() when you’re doneCall SubmitChanges() when you’re done Currently supports SQL 2000 & 2005Currently supports SQL 2000 & 2005 System.Date.Linq.SqlClient.Sql2000ProviderSystem.Date.Linq.SqlClient.Sql2000Provider System.Date.Linq.SqlClient.Sql2005ProviderSystem.Date.Linq.SqlClient.Sql2005Provider Write queries in any.NET language to retrieve and manipulate data from SQLWrite queries in any.NET language to retrieve and manipulate data from SQL Use FK constraints for defining relations of data without joinsUse FK constraints for defining relations of data without joins Join in code on any column that has no FK definedJoin in code on any column that has no FK defined Use FK’s to query/modify data in SQL DBUse FK’s to query/modify data in SQL DB Call SubmitChanges() when you’re doneCall SubmitChanges() when you’re done Currently supports SQL 2000 & 2005Currently supports SQL 2000 & 2005 System.Date.Linq.SqlClient.Sql2000ProviderSystem.Date.Linq.SqlClient.Sql2000Provider System.Date.Linq.SqlClient.Sql2005ProviderSystem.Date.Linq.SqlClient.Sql2005Provider
DEMODEMO LINQ to SQL ToString() Modifying Queries Mapping Styles Mapping Tools
LINQ to XML LINQ to XML is a new way to construct, write and read XML data in the.NET language of the developers’ choiceLINQ to XML is a new way to construct, write and read XML data in the.NET language of the developers’ choice Simplifies working with XMLSimplifies working with XML No more XPath or XSLTNo more XPath or XSLT Not a replacement for DOM or any of the current XML libsNot a replacement for DOM or any of the current XML libs Supports writing Query ExpressionsSupports writing Query Expressions Can be combined with any of the other LINQ technologiesCan be combined with any of the other LINQ technologies Supports SAX-style reading/writing of documents with the use of XStreamingElementSupports SAX-style reading/writing of documents with the use of XStreamingElement Differed executionDiffered execution LINQ to XML is a new way to construct, write and read XML data in the.NET language of the developers’ choiceLINQ to XML is a new way to construct, write and read XML data in the.NET language of the developers’ choice Simplifies working with XMLSimplifies working with XML No more XPath or XSLTNo more XPath or XSLT Not a replacement for DOM or any of the current XML libsNot a replacement for DOM or any of the current XML libs Supports writing Query ExpressionsSupports writing Query Expressions Can be combined with any of the other LINQ technologiesCan be combined with any of the other LINQ technologies Supports SAX-style reading/writing of documents with the use of XStreamingElementSupports SAX-style reading/writing of documents with the use of XStreamingElement Differed executionDiffered execution
LINQ to XML Combining it with other LINQ technologies makes life easierCombining it with other LINQ technologies makes life easier XElement xml = new XElement("contacts", new XElement("contact", new new XAttribute("contactId", "2"), new XElement("firstName", "Barry"), new XElement("lastName", "Gottshall") ), new XElement("contact", new XAttribute("contactId", "2"), new XElement("firstName", "Barry"), new XElement("lastName", "Gottshall") ), new XElement("contact",new new XAttribute("contactId", "3"), new XAttribute("contactId", "3"),new new XElement("firstName", "Armando"), new XElement("lastName", "Valdes") ) ); new XElement("firstName", "Armando"), new XElement("lastName", "Valdes") ) );new
LINQ to XML Result from previous example:Result from previous example: <contacts> Barry Gottshall Barry Gottshall </contact> Armando Valdes Armando Valdes </contact></contacts>
LINQ to DataSet(s) Allows developers to query existing DataSet sources within applicationsAllows developers to query existing DataSet sources within applications Offline, still uses IQueryable approachOffline, still uses IQueryable approach 2 types of queries, depending on use of typed/un- typed datasets2 types of queries, depending on use of typed/un- typed datasets Use LINQ in current applications without re-writing using LINQ to SQLUse LINQ in current applications without re-writing using LINQ to SQL Bi-directional: LINQ Sequence -> DataTable -> LINQ Sequence supportBi-directional: LINQ Sequence -> DataTable -> LINQ Sequence support Allows developers to query existing DataSet sources within applicationsAllows developers to query existing DataSet sources within applications Offline, still uses IQueryable approachOffline, still uses IQueryable approach 2 types of queries, depending on use of typed/un- typed datasets2 types of queries, depending on use of typed/un- typed datasets Use LINQ in current applications without re-writing using LINQ to SQLUse LINQ in current applications without re-writing using LINQ to SQL Bi-directional: LINQ Sequence -> DataTable -> LINQ Sequence supportBi-directional: LINQ Sequence -> DataTable -> LINQ Sequence support
How Does it Work? Depends on if the type is {0} or notDepends on if the type is {0} or not IQueryable IQueryable System.Linq.Queryable (System.Data.Linq.DataQuery )System.Linq.Queryable (System.Data.Linq.DataQuery ) SQLSQL EntityEntity DatasetsDatasets The extension methods build an expression treeThe extension methods build an expression tree If not, then check if it is a IEnumerable If not, then check if it is a IEnumerable System.Linq.IEnumerable System.Linq.IEnumerable ObjectsObjects XMLXML The extension methods run the queryThe extension methods run the query Depends on if the type is {0} or notDepends on if the type is {0} or not IQueryable IQueryable System.Linq.Queryable (System.Data.Linq.DataQuery )System.Linq.Queryable (System.Data.Linq.DataQuery ) SQLSQL EntityEntity DatasetsDatasets The extension methods build an expression treeThe extension methods build an expression tree If not, then check if it is a IEnumerable If not, then check if it is a IEnumerable System.Linq.IEnumerable System.Linq.IEnumerable ObjectsObjects XMLXML The extension methods run the queryThe extension methods run the query
How Does it Work? Objects <book> </book> XML.NET Language Integrated Query C# 3.0 VB 9.0 Others… Relational LINQ to Objects LINQ to SQL LINQ to XML LINQ to Entities LINQ to Datasets
How Does it Work? Extension methods for the from/select/where/groupby keywordsExtension methods for the from/select/where/groupby keywords Lambda expressionsLambda expressions Expression tree for building & pre-compiling the statement that will run on a IQueryable Expression tree for building & pre-compiling the statement that will run on a IQueryable p=> p.CompanyName.StartsWith(“A”)p=> p.CompanyName.StartsWith(“A”) Iterators for the in-memory queries (IEnumerable )Iterators for the in-memory queries (IEnumerable ) foreach on an IEnumerable foreach on an IEnumerable Extension methods for the from/select/where/groupby keywordsExtension methods for the from/select/where/groupby keywords Lambda expressionsLambda expressions Expression tree for building & pre-compiling the statement that will run on a IQueryable Expression tree for building & pre-compiling the statement that will run on a IQueryable p=> p.CompanyName.StartsWith(“A”)p=> p.CompanyName.StartsWith(“A”) Iterators for the in-memory queries (IEnumerable )Iterators for the in-memory queries (IEnumerable ) foreach on an IEnumerable foreach on an IEnumerable
What’s Next? PLINQPLINQ Parallel FX LibraryParallel FX Library IParallelEnumerable IParallelEnumerable CTP is availableCTP is available Support for 3 rd party DB enginesSupport for 3 rd party DB engines PLINQPLINQ Parallel FX LibraryParallel FX Library IParallelEnumerable IParallelEnumerable CTP is availableCTP is available Support for 3 rd party DB enginesSupport for 3 rd party DB engines