View
1.367
Download
2
Category
Tags:
Preview:
DESCRIPTION
Agenda:Getting Started with Standard Query OperatorsLanguage features supporting the LINQ Project like:Lambda Expressions and Expression TreesExtension MethodsDeferred Query EvaluationThen touch on XLINQ and DLINQ
Citation preview
The LINQ ProjectThe LINQ Project
StandardStandardQueryQuery
OperatorsOperators
ObjectsObjects
DLinqDLinq(ADO.NET)(ADO.NET)
XLinqXLinq(System.Xml)(System.Xml)
<book> <title/> <author/> <year/> <price/></book>
XMLXML
.NET Language Integrated Query.NET Language Integrated Query
C#C# VBVB Others…Others…
SQLSQL WinFWinFSS
2
Language Integrated QueryLanguage Integrated Query
3
How does it work?How does it work?
Standard query operatorsStandard query operatorsQuery expressionsQuery expressionsExtension methodsExtension methodsLambda expressionsLambda expressionsExpression treesExpression treesLocal variable type inferenceLocal variable type inference
4
C# 3.0 Language C# 3.0 Language InnovationsInnovations
var contacts =var contacts = from c in customersfrom c in customers where c.State == "WA"where c.State == "WA" select new { c.Name, c.Phone };select new { c.Name, c.Phone };
var contacts =var contacts = customerscustomers .Where(c => c.State == "WA").Where(c => c.State == "WA") .Select(c => new { c.Name, c.Phone });.Select(c => new { c.Name, c.Phone });
Extension Extension methodsmethods
Lambda Lambda expressionsexpressions
Query Query expressionsexpressions
Object Object initializersinitializers
Anonymous Anonymous typestypes
Local Local variable type variable type
inferenceinference
5
Lambda Expressions and Lambda Expressions and Extension MethodsExtension Methods
6
Object InitializersObject Initializers
public class Rectanglepublic class Rectangle{{ private Point p1 = new Point();private Point p1 = new Point(); private Point p2 = new Point();private Point p2 = new Point();
public Point P1 { get { return p1; } }public Point P1 { get { return p1; } } public Point P2 { get { return p2; } }public Point P2 { get { return p2; } }}}
Rectangle r = new Rectangle {Rectangle r = new Rectangle { P1 = { X = 0, Y = 1 },P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 }P2 = { X = 2, Y = 3 }};};
Rectangle r = new Rectangle r = new Rectangle();Rectangle();r.P1.X = 0;r.P1.X = 0;r.P1.Y = 1;r.P1.Y = 1;r.P2.X = 2;r.P2.X = 2;r.P2.Y = 3;r.P2.Y = 3;
Embedded Embedded objectsobjects
No “new No “new Point”Point”
Read-only Read-only propertiesproperties
7
Local Variable Type Local Variable Type InferenceInference
int i = 5;int i = 5;string s = "Hello";string s = "Hello";double d = 1.0;double d = 1.0;int[] numbers = new int[] {1, 2, 3};int[] numbers = new int[] {1, 2, 3};Dictionary<int,Order> orders = new Dictionary<int,Order> orders = new Dictionary<int,Order>();Dictionary<int,Order>();
var i = 5;var i = 5;var s = "Hello";var s = "Hello";var d = 1.0;var d = 1.0;var numbers = new int[] {1, 2, 3};var numbers = new int[] {1, 2, 3};var orders = new Dictionary<int,Order>();var orders = new Dictionary<int,Order>();
““var” means var” means same type as same type as
initializerinitializer
8
Anonymous TypesAnonymous Typespublic class Customerpublic class Customer{{ public string Name;public string Name; public Address Address;public Address Address; public string Phone;public string Phone; public List<Order> Orders;public List<Order> Orders; … …}}
public class Contactpublic class Contact{{ public string Name;public string Name; public string Phone;public string Phone;}}
Customer c = GetCustomer(…);Customer c = GetCustomer(…);Contact x = Contact x = new Contact { Name = c.Name, Phone = new Contact { Name = c.Name, Phone = c.Phone }c.Phone };;
Customer c = GetCustomer(…);Customer c = GetCustomer(…);var x = var x = new { c.Name, c.Phone }new { c.Name, c.Phone };;
Customer c = GetCustomer(…);Customer c = GetCustomer(…);var x = var x = new { Name = c.Name, Phone = c.Phone }new { Name = c.Name, Phone = c.Phone };;
class ???class ???{{ public string public string Name;Name; public string public string Phone;Phone;}}
Projection style Projection style initializerinitializer
9
Query ExpressionsQuery Expressions
Language integrated query syntaxLanguage integrated query syntax
fromfrom idid inin sourcesource{ { fromfrom idid inin sourcesource | | wherewhere conditioncondition } }[ [ orderbyorderby orderingordering, , orderingordering, … ], … ]selectselect exprexpr | | groupgroup exprexpr byby keykey[ [ intointo idid queryquery ] ]
Starts with Starts with fromfrom Zero or more Zero or more
fromfrom or or wherewhere
Optional Optional orderbyorderby
Ends with Ends with selectselect or or groupgroup bybyOptional Optional intointo
continuationcontinuation
10
from c in customersfrom c in customerswhere c.State == "WA"where c.State == "WA"select new { c.Name, c.Phone };select new { c.Name, c.Phone };
customerscustomers.Where(c => c.State == "WA").Where(c => c.State == "WA").Select(c => new { c.Name, c.Phone });.Select(c => new { c.Name, c.Phone });
Query ExpressionsQuery Expressions
Queries translate to method Queries translate to method invocationsinvocations
Where, Select, SelectMany, OrderBy, Where, Select, SelectMany, OrderBy, GroupByGroupBy
11
C# 3.0 Language C# 3.0 Language InnovationsInnovations
Lambda expressionsLambda expressions
Extension methodsExtension methods
Local variable type inferenceLocal variable type inference
Object initializersObject initializers
Anonymous typesAnonymous types
Query expressionsQuery expressions
Expression treesExpression trees
var x = 5;var x = 5;
static void Dump(this static void Dump(this object o);object o);
c => c => c.Namec.Name
new Point { x = 1, y new Point { x = 1, y = 2 }= 2 }
new { c.Name, new { c.Name, c.Phone }c.Phone }
from … where … from … where … selectselect
Expression<TExpression<T>>
12
Standard Query OperatorsStandard Query OperatorsRestrictionRestriction WhereWhere
ProjectionProjection Select, SelectManySelect, SelectMany
OrderingOrdering OrderBy, ThenByOrderBy, ThenBy
GroupingGrouping GroupByGroupBy
QuantifiersQuantifiers Any, AllAny, All
PartitioningPartitioning Take, Skip, TakeWhile, SkipWhileTake, Skip, TakeWhile, SkipWhile
SetsSets Distinct, Union, Intersect, ExceptDistinct, Union, Intersect, Except
ElementsElements First, FirstOrDefault, ElementAtFirst, FirstOrDefault, ElementAt
AggregationAggregation Count, Sum, Min, Max, AverageCount, Sum, Min, Max, Average
ConversionConversion ToArray, ToList, ToDictionaryToArray, ToList, ToDictionary
CastingCasting OfType<T>OfType<T>
13
Deferred Query ExecutionDeferred Query ExecutionCustomer[] custs = SampleData.GetCustomers();Customer[] custs = SampleData.GetCustomers();
custscusts
PhonePhoneNameNameIDID
var query = from c in custs where c.City == "London" select var query = from c in custs where c.City == "London" select c.Name;c.Name;
var query = custs.Where(c => c.City == "London").Select(c var query = custs.Where(c => c.City == "London").Select(c => c.Name);=> c.Name);
SelectSelect
c => c => c.Namec.Name
string[] names = query.ToArray();string[] names = query.ToArray();
namesnames
c => c.City == c => c.City == "London""London"
WhereWhere
14
DLinq For Relational DataDLinq For Relational Data
SqlConnection c = new SqlConnection(…);SqlConnection c = new SqlConnection(…);c.Open();c.Open();SqlCommand cmd = new SqlCommand(SqlCommand cmd = new SqlCommand( @"SELECT c.Name, c.Phone@"SELECT c.Name, c.Phone FROM Customers cFROM Customers c WHERE c.City = @p0");WHERE c.City = @p0");cmd.Parameters.AddWithValue("@p0", cmd.Parameters.AddWithValue("@p0", "London“);"London“);DataReader dr = c.Execute(cmd);DataReader dr = c.Execute(cmd);while (dr.Read()) {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();dr.Close();
Accessing data todayAccessing data todayQueries in Queries in
quotesquotes
Loosely Loosely bound bound
argumentsarguments
Loosely Loosely typed result typed result
setssets
No compile No compile time checkstime checks
15
public class Customer { … }public class Customer { … }
public class Northwind: DataContextpublic class Northwind: DataContext{{ public Table<Customer> Customers;public Table<Customer> Customers; … …}}
Northwind db = new Northwind(…);Northwind db = new Northwind(…);var contacts =var contacts = from c in db.Customersfrom c in db.Customers where c.City == "London"where c.City == "London" select new { c.Name, c.Phone };select new { c.Name, c.Phone };
DLinq For Relational DataDLinq For Relational Data
Accessing data with DLinqAccessing data with DLinqClasses Classes
describe datadescribe data
Strongly Strongly typed typed
connectionconnection
Integrated Integrated query syntaxquery syntax
Strongly Strongly typed resultstyped results
Tables are Tables are like like
collectionscollections
16
DLinq For Relational DataDLinq For Relational Data
Language integrated data accessLanguage integrated data accessMaps tables and rows to classes and Maps tables and rows to classes and objectsobjects
Builds on ADO.NET and .NET Builds on ADO.NET and .NET TransactionsTransactions
MappingMappingEncoded in attributesEncoded in attributes
Relationships map to propertiesRelationships map to properties
PersistencePersistenceAutomatic change trackingAutomatic change tracking
Updates through SQL or stored Updates through SQL or stored proceduresprocedures
17
XLinq For XML DataXLinq For XML Data
XmlDocument doc = new XmlDocument();XmlDocument doc = new XmlDocument();XmlElement contacts = doc.CreateElement("contacts");XmlElement contacts = doc.CreateElement("contacts");foreach (Customer c in customers)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);doc.AppendChild(contacts);
Programming XML todayProgramming XML today
<contacts><contacts> <contact><contact> <name>Great Lakes <name>Great Lakes Food</name>Food</name> <phone>(503) <phone>(503) 555-7123</phone>555-7123</phone> </contact></contact> … …</contacts></contacts>
Imperative Imperative modelmodel
Document Document centriccentric
No integrated No integrated queriesqueries
Memory Memory intensiveintensive
18
XLinq For XML DataXLinq For XML Data
XElement contacts = new XElement("contacts",XElement contacts = new XElement("contacts", from c in customersfrom 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 XLinqProgramming XML with XLinqDeclarative Declarative
modelmodel
ElementElementcentriccentric
Integrated Integrated queriesqueries
Smaller and Smaller and fasterfaster
19
XLinq For XML DataXLinq For XML Data
Language integrated query for XMLLanguage integrated query for XMLExpressive power of XPath / XQueryExpressive power of XPath / XQuery
But with C# or VB as programming But with C# or VB as programming languagelanguage
Leverages experience with DOMLeverages experience with DOMElement centric, not document centricElement centric, not document centric
Functional constructionFunctional construction
Text nodes are just stringsText nodes are just strings
Simplified XML namespace supportSimplified XML namespace support
Faster and smallerFaster and smaller
20
The LINQ ProjectThe LINQ Project
Language Integrated Query for .NETLanguage Integrated Query for .NETNative query syntax in C# 3.0 and VB Native query syntax in C# 3.0 and VB 9.09.0
Standard Query OperatorsStandard Query OperatorsSQL-like queries for any .NET collectionSQL-like queries for any .NET collection
DLinqDLinqQuery enabled data access frameworkQuery enabled data access framework
XLinqXLinqQuery enabled, smaller, faster XML DOMQuery enabled, smaller, faster XML DOM
21
Benefits Of LINQBenefits Of LINQ
Unified querying of objects, Unified querying of objects,
relational, XMLrelational, XML
Type checking and IntelliSense for Type checking and IntelliSense for
queries queries
SQL and XQuery-like power in C# SQL and XQuery-like power in C#
and VBand VB
Extensibility model for languages / Extensibility model for languages /
APIsAPIs
Recommended