c# 3.0 and linq pavel yosifovich cto, hi-tech college [email protected]
Post on 22-Dec-2015
215 views
TRANSCRIPT
C# 3.0 and LINQC# 3.0 and LINQ
Pavel Yosifovich
CTO, Hi-Tech College
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
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
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 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