Introducing LINQ
Learn More @ http://www.learnnowonline.com Copyright Š by Application Developers Training Company
Objectives • Motivate the need for LINQ • Learn about the various LINQ providers • Investigate simple LINQ to Objects, LINQ to SQL, and LINQ to XML samples
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Agenda • Language Integrated Query • Structure of a LINQ Query • Some LINQ Examples
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Language Integrated Query • Querying and manipulating data has always been a fundamental part of our jobs as developers • Data formats change, but core needs are the same Must create, retrieve, update, and delete data
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Data Access
(DBASE, 1985 or so) USE empl REPLACE ALL salary WITH (salary * 1.1) FOR supervises > 0 LIST ALL fname, lname, salary FOR Supervises > 0
Learn More @ http://www.learnnowonline.com Copyright Š by Application Developers Training Company
Data Access APIs (C#) (late 1990s/early 2000s)
SqlCommand cmd = new SqlCommand( @"SELECT fname, lname, salary FROM Empl WHERE supervises > @p0" ); cmd.Parameters.AddWithValue("@po", 0); SqlConnection c = new SqlConnection(…); c.Open(); DataReader people = c.Execute(cmd); while (people.Read()) { string fname = (string) people["fname"]; string lname = (string) people["lname"]; double salary = (double) people["salary"]; } people.Close(); Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Object/Relational Mapping (C#) (last few years)
public class Employee { public string FirstName; public string LastName; public double Salary; } IList employees = session.CreateCriteria(typeof(Employee)) .Add(Expression.Gt("supervises", 0) .List(); foreach(Employee employee in employees) { string fname = employee.FirstName; string lname = employee.LastName; double salary = employee.Salary; } Learn More @ http://www.learnnowonline.com Copyright Š by Application Developers Training Company
Data Access APIs (VB) (late 1990s/early 2000s)
Dim cmd As New SqlCommand( _ "SELECT fname, lname, salary" & _ " FROM Empl" & _ " WHERE supervises > @p0") cmd.Parameters.AddWithValue("@p0", 0) Dim cnn as New SqlConnection(…) cnn.Open() Dim people As DataReader = cnn.Execute(cmd) While people.Read() Dim fname As String = people("fname").ToString() Dim lname As String = people("lname").ToString() Dim salary As Double = CDbl(people("salary")) End While people.Close(); Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Object/Relational Mapping (VB) (last few years)
Public Class Employee Public FirstName As String Public LastName As String Public Salary As Double End Class Dim employees As IList = _ session.CreateCriteria(GetType(Employee). _ Add(Expression.Gt("supervises", 0).List() For Each employee As Employee In Employees Dim fname As String = people("fname").ToString() Dim lname As String = people("lname").ToString() Dim salary As Double = CDbl(people("salary")) Next employee Learn More @ http://www.learnnowonline.com Copyright Š by Application Developers Training Company
Object/Relational Mapping • Provides: Mapping between relational data to/from objects Cleaner integration of business rules and validation
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ to the Rescue • How do you retrieve non-relational data? XML, RSS, Web Services, REST, AD, Files, and so on
• How do you interact with plain old objects? How do you interact and query custom domain models?
• How do you enable clean code in both a strongly typed and dynamic language world?
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ • Query, Set, and Transform Operations for .NET • Makes querying data a core programming concept • Works with all types and shapes of data Relational databases XML Plain old objects
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ • Works with all .NET languages VB and C# have integrated language support
• Works in any kind of project including Windows and Web projects • Also can find third party LINQ providers Amazon.com for example
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Providers • C# uses LINQ providers to map your LINQ queries to the data source that you’re querying • The LINQ provider takes the query that you create in code, and converts it into commands that the data source will be able to execute • On return from executing the commands, the provider also converts the data into objects that create your query results
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Overview VB
Others…
C# .NET Language-Integrated Query LINQ enabled data sources
LINQ enabled ADO.NET LINQ To Objects
LINQ To Datasets
LINQ To SQL
LINQ To Entities
LINQ To XML
<book> <title/> <author/> <price/> </book>
Objects
Relationa l Copyright © by Application Developers Training Company
Learn More @ http://www.learnnowonline.com
XM L
LINQ Providers • LINQ to Objects Allows you to query in-memory of sets of objects o o
Collections, arrays, and lists If a class implements IEnumerable (or generic version), you can use LINQ to query
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Providers • LINQ to SQL Allows you to query and modify data in SQL Server You provide mapping between a modeling class and schema in data source Use System.Data.Linq.DataContext class to provide the “plumbing” Can use Visual Studio’s O/R designer to make it easy o
For now, will mark up entity class manually
DataContext manages communication o
Stores state for optimistic concurrency checks
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Providers • LINQ to XML Easy to query, modify, and generate XML content Can work with XML from file, or from stream System.Linq.Xml.XObject, Xnode, XElement, XAttribute o
Make it easy to work with XML programmatically
LINQ to XML provider works with these classes to create queryable collections of XML data Visual Basic adds language-specific rich support for LINQ to XML
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Providers • LINQ to DataSet Allows you to query and update data in ADO.NET dataset Can use querying engine against data already cached in client application Strongly typed datasets easier to work with than standard datasets o
You already know the schema—it's just LINQ to Objects
Language features make it possible to query standard datasets
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ Providers • LINQ to Entities Allows developers to query data exposed using Entity Data Model (EDM) o
EDM: conceptual model, allows applications to interact with data as if it was a collection of objects, or entities
Using EDM, ADO.NET exposes entities as objects in .NET Framework, allows LINQ queries to operate Conceptually, same as LINQ to SQL, but works with any data source o
Doesn't assume one-to-one mapping between classes and schema
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Agenda • Language Integrated Query • Structure of a LINQ Query • Some LINQ Examples
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Structure of a LINQ Query • LINQ query contains clauses that specify data sources and iteration variables • Query expressions can also include:
Filtering Sorting Grouping Joining Calculating
• From required—indicates source of data Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
The Three Stages of a LINQ Query • Each LINQ query requires three stages: Obtain the data source(s) Create the query Execute the query
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
The Data Source • In the sample, data source is an array of integers • Because array implements IEnumerable, can query against it Treated as a "queryable" type
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
XML as Data Source (VB) • Could use LINQ to XML to load contents of an XML file into a queryable collection of XElement instances: ' VB Dim items As XElement = XElement.Load("C:\Grocery.xml")
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
XML as Data Source (C#) • Could use LINQ to XML to load contents of an XML file into a queryable collection of XElement instances: // C#: XElement items = XElement.Load(@"C:\Grocery.xml");
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
SQL as Data Source (VB) • Can use LINQ to SQL once you have a class that provides object-relational mapping: ' VB Dim dc As New DataContext( _ My.Settings.NorthwindConnectionString) Dim customers As Table(Of Customer) = _ dc.GetTable(Of Customer)
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
SQL as Data Source (C#) • Can use LINQ to SQL once you have a class that provides object-relational mapping: // C# DataContext dc = new DataContext( Properties.Settings.Default.NorthwindConnectionString); Table<Customer> customers = dc.GetTable<Customer>();
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
The Query • Given the data source, can specify the query Defines the information you want to retrieve Optionally, can specify how to sort, filter, and group
• LINQ queries are generally the same, no matter the data source
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
The Query Execution • Query definition doesn't execute the query • Instead, defines the query that will run when it's time to retrieve the data • To execute, need to run code that forces query reference to require the values In this course, For Each loop generally forces
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Returning Multiple Values • Want to return multiple values? • In general, two options: Create class that exposes properties o
Specify new instance of class in Select
Specify values in Select clause o
Compiler creates a new anonymous type containing just the properties you specify
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Creating a Class for Return Values • See MyFileInfo class and MultipleReturnValues1
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Using an Anonymous Type • In previous example, code created a simple type (MyFileInfo) Type contained properties returned by query Why create a class simply to return values?
• Anonymous types generally simpler • Compiler creates the type, based on values specified in query Select clause You don't know the type's name Implicit type definition makes it possible to work with the anonymous type Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Deferred Execution • Defining query doesn't cause query to execute • Must actually force execution by requesting data • In other words: Creating query doesn't return data Provides potential for returning data
• Can take advantage of deferred execution Break query into small steps without fear of multiple trips to the server for data Makes debugging simpler, as well Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Converting Results to Force Execution • Sometimes, might want to immediately execute query and cache its results • Can use method like ToList or ToArray • Each executes query, and returns results
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Agenda • Language Integrated Query • Structure of a LINQ Query • Some LINQ Examples
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Some LINQ Examples • Get a taste of the kinds of things you can do with LINQ • Introduce some of the new language features for LINQ • Examples of: LINQ to Objects LINQ to SQL LINQ to XML
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ to Objects • Can use any collection that implements IEnumerable (or generic version) as data source • Note example uses multiple overloaded versions of DisplayResults procedure
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Query Syntax/Extension Methods (C#) • How does language compiler turn keywords like select, where, and orderby into executable code? Keywords need to be converted into methods
• Each LINQ keyword corresponds to a single method of the System.Linq.Enumerable
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Query Syntax/Extension Methods (VB) • How does language compiler turn keywords like Select, Where, and Order By into executable code? Keywords need to be converted into methods
• Each LINQ keyword corresponds to a single method of the System.Linq.Enumerable
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Continuing the Investigation • So compiler converts keywords into methods • But IEnumerable is an old interface It doesn't support Where, Select, and so on Where do those methods come from?
• LINQ requires ability to extend existing interfaces/classes without changing their definitions Available because of new extension methods
• Extension method exists in one class Allows code to extend a different class Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Extension Methods (VB) • Add new methods to existing classes • Not just for LINQ, but crucial for LINQ • Extension methods must: Accept a parameter, the type of which defines the class that you’re extending Exist within a module Include the <Extension()> attribute
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Extension Methods (C#) • Add new methods to existing classes • Not just for LINQ, but crucial for LINQ • Extension methods must: Accept a parameter, the type of which defines the class that you’re extending Exist within a static class Be a static method Include the this keyword in the parameter
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Using LINQ to Group Output • System.Linq.Enumerable class provides large number of methods • Look for grouping methods
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ to SQL • Allows standard LINQ queries to work with data stored in relational databases Extends ADO.NET Adds support for mapping tables and rows to classes and properties
• To support LINQ to SQL, must add custom .NET attributes to class that represents the schema • Map a class to a table Map properties within the class to columns All by adding attributes
• Can represent relationships as well Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Linking a Class to SQL Server • Retrieve data from Northwind Customers table • Retrieve CustomerID, CompanyName, ContactName, Country, Region • Indicate primary key, columns, and rename column
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Creating the Class • Start by creating a class with properties that correspond to columns in the database • See Customer1 class
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Marking Up the Class • Use attributes from the System.Data.Linq.Mapping namespace Table Column Many others
• See Customer class
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Retrieving a Collection of Customers • Need some mechanism to manage connection between class and data Can't simply fill some huge data structure with all the data Need some class that converts requests for data into SQL strings, and executes/virtualizes
• System.Data.Linq.DataContext class Includes members that provide access to data Tracks changes to data for updates O/R designer creates classes, and new class that inherits from DataContext Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Determining the Actual SQL String • Set Log property of DataContext to stream Sends all information to the output stream
• To simply see the SQL string Call ToString method of query variable
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Working with Anonymous Types • Anonymous types work well with LINQ to SQL • Often need to retrieve just a subset of columns Or perform a calculation
• See DemoLinqToSqlWithAnonymousTypes
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
LINQ to XML • Need to retrieve, create, query XML? • .NET Framework provides rich support Steps can be complex Can require XSLT and XPath
• What if you could accomplish these using a standard syntax? • That is, what about LINQ? • LINQ to XML makes it possible • Examples create XML content Examine Course class, and CreateCourseList Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Life without LINQ to XML • Without LINQ to XML, creating XML content required multiple steps XmlDocument creates new elements Set properties Append as child of new parent
• See DemoNoLinqToXml
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Using System.Xml.Linq Classes • System.Xml.Linq namespace adds classes XElement, XAttribute, XComment All inherit from XObject
• Each provides overloaded constructors You pass as much information as necessary to generate the XML More readable than XmlDocument code
• Examine CreateXmlContent
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Creating Data: From and Select • From clause sets up range variable iterating over data source • Select clause specifies "shape" of resulting data • Take advantage of these facts to use LINQ to generate XML content • Examine DemoLinqToXml
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Visual Basic Only (VB) • Only Visual Basic adds new features that make it far easier to work with LINQ to XML XML literals XML replacement tokens
• See CreateXmlContentVBOnly
Learn More @ http://www.learnnowonline.com Copyright © by Application Developers Training Company
Learn More! â&#x20AC;˘ This is an excerpt from a larger course. Visit www.learnnowonline.com for the full details!
Learn More @ http://www.learnnowonline.com Copyright Š by Application Developers Training Company