LINQ: It’s Not Your Father’s Data Access Denny Boynton Anheuser-Busch Companies
Goals –Provide overview of the LINQ project –Demonstrate basic functionality of LINQ –Point out learning resources for self study
What is LINQ? “Language Integrated Query” Evolution of application data management Coming with C# 3.0 and VB.NET 9.0 Anders Hejlsberg Don Box
The Problem –Worlds of OO and data access are far, far apart –OO language types and native database types are often different –SQL code is “inside the quotes” No strong typing or compile-time type checking No Intellisense No Statement completion –SQL and XML have query languages, objects to not LINQ seeks to bridge the gap
What is LINQ? Standard Query Operators Objects DLinq (ADO.NET) XLinq(System.Xml) XML.NET Language Integrated Query C#VBOthers… SQLWinFS Source: Anders Hejlsberg’s PDC Presentation
Examine the basics of LINQ Demo
Language Enhancements Lambda Expressions Extension Methods Local Variable Type Inference Object Initializers Anonymous Types Query Expressions C => c.Name c.Customers.Where(…).Select(…) var n = 5; new Point {x=1, y=2} New {c.Name, c.Phone}from..where…select
Standard Query Operators RestrictionWhere ProjectionSelect, SelectMany OrderingOrderBy, ThenBy GroupingGroupBy QuantifiersAny, All PartitioningTake, Skip, TakeWhile, SkipWhile SetsDistinct, Union, Intersect, Except ElementsFirst, FirstOrDefault, ElementAt AggregationCount, Sum, Min, Max, Average ConversionToArray, ToList, ToDictionary CastingOfType Source: Anders Hejlsberg’s PDC Presentation
DLinq A means of managing relational data SqlConnection c = new SqlConnection(…); c.Open(); SqlCommand cmd = new c.Name, c.Name, c.Phone FROM Customers c FROM Customers c WHERE c.City WHERE c.City "London“); DataReader dr = c.Execute(cmd); while (dr.Read()) { string name = dr.GetString(0); string name = dr.GetString(0); string phone = dr.GetString(1); string phone = dr.GetString(1); DateTime date = dr.GetDateTime(2); DateTime date = dr.GetDateTime(2);}dr.Close(); Accessing data today: Queries in quotes Loosely bound arguments Loosely typed result sets No compile time checks
DLinq public class Customer { … } public class Northwind: DataContext { public Table Customers; public Table Customers; …} Northwind db = new Northwind(…); var contacts = from c in db.Customers from c in db.Customers where c.City == "London" where c.City == "London" select new { c.Name, c.Phone }; select new { c.Name, c.Phone }; Accessing data with DLinq Classes describe data Strongly typed connection Integrated query syntax Strongly typed results Tables are like collections
DLinq Language integrated data access –Maps tables and rows to classes and objects –Builds on ADO.NET and.NET Transactions Mapping –Encoded in attributes –Relationships map to properties Persistence –Automatic change tracking –Updates through SQL or stored procedures
XLinq XmlDocument doc = new XmlDocument(); XmlElement contacts = doc.CreateElement("contacts"); foreach (Customer c in customers) if (c.Country == "USA") { if (c.Country == "USA") { XmlElement e = doc.CreateElement("contact"); XmlElement e = doc.CreateElement("contact"); XmlElement name = doc.CreateElement("name"); XmlElement name = doc.CreateElement("name"); name.InnerText = c.CompanyName; name.InnerText = c.CompanyName; e.AppendChild(name); e.AppendChild(name); XmlElement phone = doc.CreateElement("phone"); XmlElement phone = doc.CreateElement("phone"); phone.InnerText = c.Phone; phone.InnerText = c.Phone; e.AppendChild(phone); e.AppendChild(phone); contacts.AppendChild(e); contacts.AppendChild(e); }doc.AppendChild(contacts); Programming XML today <contacts> Great Lakes Food Great Lakes Food (503) (503) …</contacts> Imperative model Document centric No integrated queries Memory intensive
XLinq XElement contacts = new XElement("contacts", from c in customers from c in customers where c.Country == "USA" where c.Country == "USA" select new XElement("contact", select new XElement("contact", new XElement("name", c.CompanyName), new XElement("name", c.CompanyName), new XElement("phone", c.Phone) new XElement("phone", c.Phone) )); Programming XML with XLinq Declarative model Element centric Integrated queries Smaller and faster
XLinq Language integrated query for XML –Expressive power of XPath / XQuery –But with C# or VB as programming language Leverages experience with DOM –Element centric, not document centric –Functional construction –Text nodes are just strings –Simplified XML namespace support –Faster and smaller
Show DLinq and XLinq in action Demo
What is LINQ? The LINQ project is: –Language Integrated Query for.NET Native query syntax for.NET languages –Standard Query Operators SQL-like method extensions for any.NET collection System.Query namespace –DLinq Code name for future version of ADO.NET Query enabled data access framework System.Data.Xlinq namespace –XLinq Query enabled, smaller, faster XML DOM System.XML.Xlinq namespace
Benefits of LINQ Unified querying of objects, relational, XML Type checking and IntelliSense for queries SQL and XQuery-like power in C# and VB Extensibility model for languages / APIs
Closing Thoughts Not sure where use of LINQ will coincide with SQL Use may well be driven by data management standards of an organization –Where should data access really “live” ORM synchronization This could really be a revolution
Resources LINQ Project Home Page – Anders Hejlsberg – LINQ – 80http://channel9.msdn.com/showpost.aspx?postid= LINQ Project Overview Whitepaper – ull=/library/en-us/dndotnet/html/linqprojectovw.asp
Thank You Denny Boynton