c# 3.0 and linq pavel yosifovich cto, hi-tech college [email protected]

24
C# 3.0 and LINQ Pavel Yosifovich CTO, Hi-Tech College [email protected] http://blogs.microsoft.co.il/ blogs/pavely

Post on 22-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

C# 3.0 and LINQC# 3.0 and LINQ

Pavel Yosifovich

CTO, Hi-Tech College

[email protected]

http://blogs.microsoft.co.il/blogs/pavely

AgendaAgenda

• C# 3.0 New Features

• Introduction to LINQ

• LINQ to Objects

• LINQ to SQL

• LINQ to XML

• Summary

2©2008 Pavel Yosifovich

C# 3.0 FeaturesC# 3.0 Features

• Implicitly Typed Local Variables

• Automatic Properties

• Object and Collection Initializers

• Anonymous Types

• Extension Methods

• Lambda Expressions

• LINQ

3©2008 Pavel Yosifovich

Implicitly Typed Local VariablesImplicitly Typed Local Variables

• The var keyword

// C# 2.0int x = 5;string name = "Bart Simpson";Dictionary<string, object> data = new Dictionary<string, object>();int size = name.Length;

// C# 2.0int x = 5;string name = "Bart Simpson";Dictionary<string, object> data = new Dictionary<string, object>();int size = name.Length;

// C# 3.0var x = 5;var name = "Bart Simpson";var data = new Dictionary<string, object>();var size = name.Length;

var y = x;var keys = data.Keys; // Dictionary<string, object>.KeyCollection

// C# 3.0var x = 5;var name = "Bart Simpson";var data = new Dictionary<string, object>();var size = name.Length;

var y = x;var keys = data.Keys; // Dictionary<string, object>.KeyCollection

4©2008 Pavel Yosifovich

Automatic PropertiesAutomatic Propertiespublic class Person { // C# 2.0

private string _firstName, _lastName;

private int _age;

public string FirstName {get { return _firstName; }set { _firstName = value; }

}public string LastName {

get { return _lastName; }set { _lastName = value; }

}public int Age {

get { return _age; }set { _age = value; }

}}

public class Person { // C# 2.0private string _firstName,

_lastName;private int _age;

public string FirstName {get { return _firstName; }set { _firstName = value; }

}public string LastName {

get { return _lastName; }set { _lastName = value; }

}public int Age {

get { return _age; }set { _age = value; }

}}

public class Person { // C# 3.0public string FirstName { get;

set; }public string LastName { get; set; }public int Age { get; set; }

}

public class Person { // C# 3.0public string FirstName { get;

set; }public string LastName { get; set; }public int Age { get; set; }

}

5©2008 Pavel Yosifovich

Object InitializersObject Initializers

// C# 2.0

Person p = new Person();p.FirstName = "Bart";p.LastName = "Simpson";p.Age = 12;

// C# 2.0

Person p = new Person();p.FirstName = "Bart";p.LastName = "Simpson";p.Age = 12;

// C# 3.0

Person p = new Person() { FirstName = "Bart", LastName = "Simpson", Age = 12

};

// C# 3.0

Person p = new Person() { FirstName = "Bart", LastName = "Simpson", Age = 12

};

6©2008 Pavel Yosifovich

Collection InitializersCollection Initializers// C# 3.0

List<Person> people = new List<Person>();people.Add(new Person() {

FirstName = "Bart", LastName = "Simpson", Age = 12 });people.Add(new Person() {

FirstName = "Clark", LastName = "Kent", Age = 35 });people.Add(new Person() {

FirstName = "Peter", LastName = "Parker", Age = 30 });

// C# 3.0

List<Person> people = new List<Person>();people.Add(new Person() {

FirstName = "Bart", LastName = "Simpson", Age = 12 });people.Add(new Person() {

FirstName = "Clark", LastName = "Kent", Age = 35 });people.Add(new Person() {

FirstName = "Peter", LastName = "Parker", Age = 30 });// C# 3.0

var people = new List<Person>() {new Person() { FirstName = "Bart", LastName = "Simpson", Age =

12 },new Person() { FirstName = "Clark", LastName = "Kent", Age =

35 },new Person() { FirstName = "Peter", LastName = "Parker", Age =

30 }};

// C# 3.0

var people = new List<Person>() {new Person() { FirstName = "Bart", LastName = "Simpson", Age =

12 },new Person() { FirstName = "Clark", LastName = "Kent", Age =

35 },new Person() { FirstName = "Peter", LastName = "Parker", Age =

30 }};

7©2008 Pavel Yosifovich

Anonymous TypesAnonymous Types

var people = new[] {new { FirstName = "Clark", LastName = "Kent", Age = 36 },new { FirstName = "Peter", LastName = "parker", Age = 26 },new { FirstName = "Bart", LastName = "Simpson", Age = 11 }

};

foreach (var i in people)Console.WriteLine("{0} {1} ({2})", i.FirstName, i.LastName,

i.Age);

Console.WriteLine(people[0].GetType().FullName); // ???

var people = new[] {new { FirstName = "Clark", LastName = "Kent", Age = 36 },new { FirstName = "Peter", LastName = "parker", Age = 26 },new { FirstName = "Bart", LastName = "Simpson", Age = 11 }

};

foreach (var i in people)Console.WriteLine("{0} {1} ({2})", i.FirstName, i.LastName,

i.Age);

Console.WriteLine(people[0].GetType().FullName); // ???

8©2008 Pavel Yosifovich

Extension MethodsExtension Methods

public static class MyExtensions {public static string UpperLower(this string str, bool

upperFirst) {StringBuilder newString = new StringBuilder(str.Length);for (int i = 0; i < str.Length; i++) {

newString.Append(upperFirst ? char.ToUpper(str[i]) :char.ToLower(str[i]));

upperFirst = !upperFirst; } return newString.ToString(); }}

public static class MyExtensions {public static string UpperLower(this string str, bool

upperFirst) {StringBuilder newString = new StringBuilder(str.Length);for (int i = 0; i < str.Length; i++) {

newString.Append(upperFirst ? char.ToUpper(str[i]) :char.ToLower(str[i]));

upperFirst = !upperFirst; } return newString.ToString(); }}

string input = Console.ReadLine();Console.WriteLine("calling extension method for {0}: {1}", input,

input.UpperLower(true));

string input = Console.ReadLine();Console.WriteLine("calling extension method for {0}: {1}", input,

input.UpperLower(true));

9©2008 Pavel Yosifovich

EXTENSION METHODSEXTENSION METHODSDEMO

ProblemProblem

Strongly typed, Intellisense, Compilers, Debuggers

(Imperative)

Projection, Join, Grouping, Queries

(Declarative)

Data as ObjectsObjects as Data

11©2008 Pavel Yosifovich

What is LINQ?What is LINQ?

• Unified programming model for any data type/source– Collections– Database Relational Data– XML Files– Extendable for anything else

• Introduce more declarative syntax

• Data is equivalent to Objects

12©2008 Pavel Yosifovich

LINQ enabled ADO.NETLINQ enabled ADO.NET

LINQ ArchitectureLINQ Architecture

XMLObjects Relational Data

.NET Language-Integrated Query (LINQ)

13©2008 Pavel Yosifovich

LINQ Syntax FundamentalsLINQ Syntax Fundamentals

• Syntax based on Extension methods

• Some Extension methods may be replaced by language keywords– where, orderby, select, group, …

• Auxiliary language features in use– Automatic properties– Anonymous types– Implicitly typed local variables– Object initializers

14©2008 Pavel Yosifovich

LINQ To ObjectsLINQ To Objects

• Working with collections– Any one that implements IEnumerable<T>

• using System.Linq• System.Core.Dll assembly

• Deferred Execution

LINQ TO OBJECTSLINQ TO OBJECTSDEMO

Classic ADO.NETClassic ADO.NET

SqlConnection conn = new SqlConnection(“...“);SqlCommand cmd = conn.CreateCommand();cmd.CommandText = @“ SELECT *                    FROM   Vehicles                    WHERE  Model = @Model";

cmd.Parameters.Add("@Model", “Mazda 3“);

SqlDataReader r = cmd.ExecuteReader();while ( r.HasRows ) {    Console.WriteLine(r[“Number"] + r[“Year"]);}

ApplicationApplication

Relational DatabaseRelational Database

No intellisence No intellisence

No compile time No compile time checkschecks

Loosely bound Loosely bound argumentsarguments

Untyped ResultsUntyped Results

LINQ To SQLLINQ To SQL

• The DataContext type

• Custom attributes (Table, Column)

• Not just “Query”

• Can use stored procedures

• using System.Data.Linq• System.Data.Linq.Dll Assembly

LINQ TO SQLLINQ TO SQLDEMO

LINQ To SQL PerformanceLINQ To SQL Performance

• Performance is good– 97% of classic ADO.NET

• Optimizations– Turn track checking off for reading only

• ObjectTrackingEnabled = false

– Use the DataLoadOptions type to minimize round trips• LoadWith<>, AssociateWith<> instance methods

– Compile frequently used queries• CompiledQuery.Compile(…)

LINQ To XMLLINQ To XML

• New object model– No need to create a document– Very intuitive and flexible

• using System.Xml.Linq• System.Xml.Linq.Dll Assembly

• Easy to combine with other LINQ providers– E.g. LINQ to SQL

LINQ TO XMLLINQ TO XMLDEMO

©2008 Pavel Yosifovich 24

Q & AQ & A??

Q & AQ & A??

SummarySummary

• LINQ Allows using data as objects and vice versa

• Same syntax across any provider

• C# Language support

• Use it today!