CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics C# 3.0 and.NET 3.5: A Brief Overview Pavel Ježek.

Slides:



Advertisements
Similar presentations
The Microsoft Technical Roadshow 2007 Language Enhancements and LINQ Daniel Moth Developer & Platform Group Microsoft Ltd
Advertisements

CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics C# Language &.NET Platform 12 th -13 th Lecture Pavel Ježek.
Extension Methods, Anonymous Types LINQ Query Keywords, Lambda Expressions Svetlin Nakov Telerik Corporation
C# and LINQ Yuan Yu Microsoft Research Silicon Valley.
ASP.NET 3.5 New Features. 2 Agenda What's New in.NET Framework 3.5? Visual Studio 2008 Enhancements LINQ (Language Integrated Query) New ASP.NET Server.
C# 3.0 & LINQ Raimond Brookman – IT Architect
LinqToSharePoint SandBoxed Solution Shakir Majeed Khan
LINQ: Language-Integrated Queries (To be included in C # 3.0) Technology developed by Anders Hejlsberg & friends at Microsoft (2005) Presented by Tal Cohen.
C# 3.0 Tom Roeder CS fa. Version 3 From PDC 2005 preview compiler available LINQ: language-integrated query High level points: adds native query.
C# 3.0 and LINQ Pavel Yosifovich CTO, Hi-Tech College
A tour of new features introducing LINQ. Agenda of LINQ Presentation We have features for every step of the way LINQ Fundamentals Anonymous Functions/Lambda.
LINQ Programming in C# LINQ CSE Prof. Roger Crawfis.
1. 2 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Decisions { class.
 Introduction  What is LINQ  Syntax  How to Query  Example Program.
Slides from Gang Luo, Xuting Zhao and Damien Guard
Extension Methods Programming in C# Extension Methods CSE Prof. Roger Crawfis.
REFACTORING Lecture 4. Definition Refactoring is a process of changing the internal structure of the program, not affecting its external behavior and.
LINQ, An IntroLINQ, An Intro Florin−Tudor Cristea, Microsoft Student Partner.
Advanced .NET Programming I 13th Lecture
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Advanced.NET Programming I 11 th Lecture Pavel Ježek
Putting it all together: LINQ as an Example. The Problem: SQL in Code Programs often connect to database servers. Database servers only “speak” SQL. Programs.
Advanced C#, part IV Niels Hallenberg IT University of Copenhagen (With thanks to Peter Sestoft and Kasper Østerbye) BAAAP – Spring 2009.
Introduction to LINQ Lecture # 19 August Introduction How do you interrogate/manipulate data? What if you could do the work in a type-safe," string-free.
LINQ and C# 3.0 Mads Torgersen Program Manager for the C# Language Microsoft Corporation.
LINQ: It’s Not Your Father’s Data Access Denny Boynton Anheuser-Busch Companies.
The.NET Language Integrated Query Project Anders Hejlsberg TLN306 Technical Fellow Microsoft Corporation.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
C# D1 CSC 298 Elements of C# code (part 2). C# D2 Writing a class (or a struct)  Similarly to Java or C++  Fields: to hold the class data  Methods:
© Satyam Computer Services Ltd POC Architecture 1 Confidential – Limited Circulation.
Neal Stublen How does XMLReader work?  XmlReader.Read() Advances to next node XmlReader properties access node name, value, attributes,
 Language Integrated Query  Make query a part of the language  Component of.NET Framework 3.5  Shipped with Visual Studio 2008.
Tuc Goodwin  Object and Component-Oriented Programming  Classes in C#  Scope and Accessibility  Methods and Properties  Nested.
Session 08 Module 14: Generics and Iterator Module 15: Anonymous & partial class & Nullable type.
Hoang Anh Viet Hà Nội University of Technology Chapter 1. Introduction to C# Programming.
 Although VERY commonly used, arrays have limited capabilities  A List is similar to an array but provides additional functionality, such as dynamic.
C# 2.0 and Future Directions Anders Hejlsberg Technical Fellow Microsoft Corporation.
C# 3.0 and LINQ Pavel Yosifovich CTO, Hi-Tech College
Advanced C# Types Tom Roeder CS fa. From last time out parameters difference is that the callee is required to assign it before returning not the.
C#.Net Software Development Versions 1.0. Overview  Rational for Extension Methods  C# Specification for Extension Methods  Requirements for Extension.
C#: Future Directions in Language Innovation Anders Hejlsberg TLN307 Technical Fellow Microsoft Corporation.
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Advanced.NET Programming I 10 th Lecture Pavel Ježek
Inside LINQ to Objects How LINQ to Objects work Inside LINQ1.
PROGRAMMING IN C#. Collection Classes (C# Programming Guide) The.NET Framework provides specialized classes for data storage and retrieval. These classes.
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics C# Language &.NET Platform 11 th Lecture Pavel Ježek
Satisfy Your Technical Curiosity C# 3.0 Raj Pai Group Program Manager Microsoft Corporation
IAP C# 2011 Lecture 2: Delegates, Lambdas, LINQ Geza Kovacs.
Object-Oriented Programming: Classes and Objects Chapter 1 1.
C# Fundamentals An Introduction. Before we begin How to get started writing C# – Quick tour of the dev. Environment – The current C# version is 5.0 –
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Advanced.NET Programming I 7 th Lecture Pavel Ježek
Advanced .NET Programming I 3nd Lecture
Introduction to LINQ and Generic Collections
Lambda Expressions By Val Feldsher.
Advanced .NET Programming I 8th Lecture
Advanced .NET Programming I 4th Lecture
Advanced .NET Programming I 7th Lecture
Advanced .NET Programming I 6th Lecture
CS360 Windows Programming
.NET and .NET Core 5.2 Type Operations Pan Wuming 2016.
.NET and .NET Core 9. Towards Higher Order Pan Wuming 2017.
Language Integrated Query (LINQ)
How to organize and document your classes
LINQ - 2 Ravi Kumar C++/C# Team.
Advanced .NET Programming I 9th Lecture
Advanced .NET Programming I 8th Lecture
Advanced .NET Programming I 7th Lecture
Advanced .NET Programming I 4th Lecture
Advanced .NET Programming I 6th Lecture
Chengyu Sun California State University, Los Angeles
CS4540 Special Topics in Web Development LINQ to Objects
Presentation transcript:

CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics C# 3.0 and.NET 3.5: A Brief Overview Pavel Ježek

C# 3.0 Features Implicitly Typed Local Variables Extension Methods Lambda Expressions Object Initializers Collection Initializers Anonymous Types Expression Trees Query Expressions C# 3.0 compiler and.NET 3.5 libraries are part of Visual Studio 2008 Pavel Ježek C# 3.0 and.NET 3.5

Implicitly Typed Local Variables Examples: var i = 5; var s = "Hello"; var d = 1.0; var numbers = new int[] {1, 2, 3}; var orders = new Dictionary (); Are equivalent to: int i = 5; string s = "Hello"; double d = 1.0; int[] numbers = new int[] {1, 2, 3}; Dictionary orders = new Dictionary (); Errors: var x; // Error, no initializer to infer type from var y = {1, 2, 3}; // Error, collection initializer not permitted var z = null; // Error, null type not permitted Pavel Ježek C# 3.0 and.NET 3.5

Extension Methods Declaration: public static partial class Extensions { public static int ToInt32(this string s) { return Int32.Parse(s); } } Usage: string s = "1234"; int i = s.ToInt32(); // Same as Extensions.ToInt32(s) Instance methods take precedence over extension methods Extension methods imported in inner namespace declarations take precedence over extension methods imported in outer namespace declarations Pavel Ježek C# 3.0 and.NET 3.5

Extension Methods (2) Declaration: public static partial class Extensions { public static T[] Slice (this T[] source, int index, int count) { if (index < 0 || count < 0 || source.Length – index < count) throw new ArgumentException(); T[] result = new T[count]; Array.Copy(source, index, result, 0, count); return result; } } Usage: int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] a = digits.Slice(4, 3); // Same as Extensions.Slice(digits, 4, 3) Pavel Ježek C# 3.0 and.NET 3.5

Lambda Expressions Example of C# 2.0 anonymous method: class Program { delegate T BinaryOp (T x, T y); static void Method (BinaryOp op, T p1, T p2) { Console.WriteLine(op(p1, p2)); } static void Main() { Method(delegate(int a, int b) { return a + b; }, 1, 2); } C# 3.0 lambda expressions provide further simplification: class Program { delegate T BinaryOp (T x, T y); static void Method (BinaryOp op, T p1, T p2) { Console.WriteLine(op(p1, p2)); } static void Main() { Method((a, b) => a + b, 1, 2); } Pavel Ježek C# 3.0 and.NET 3.5

Lambda Expressions (2) Expression or statement body Implicitly or explicitly typed parameters Examples: x => x + 1 // Implicitly typed, expression body x => { return x + 1; } // Implicitly typed, statement body (int x) => x + 1 // Explicitly typed, expression body (int x) => { return x + 1; } // Explicitly typed, statement body (x, y) => x * y // Multiple parameters () => Console.WriteLine() // No parameters A lambda expression is a value, that does not have a type but can be implicitly converted to a compatible delegate type delegate R Func (A arg); Func f1 = x => x + 1; // Ok Func f2 = x => x + 1; // Ok Func f3 = x => x + 1; // Error – double cannot be // implicitly converted to int Pavel Ježek C# 3.0 and.NET 3.5

Lambda Expressions (3) Lambda expressions participate in inference process of type arguments of generic methods In initial phase, nothing is inferred from arguments that are lambda expressions Following the initial phase, additional inferences are made from lambda expressions using an iterative process Pavel Ježek C# 3.0 and.NET 3.5

Lambda Expressions (4) Generic extension method example: public class List : IEnumerable, … { … } public static class Sequence { public static IEnumerable Select ( this IEnumerable source, Func selector) { foreach (T element in source) yield return selector(element); } Calling extension method with lambda expression: List customers = GetCustomerList(); IEnumerable names = customers.Select(c => c.Name); Rewriting extension method call: IEnumerable names = Sequence.Select (customers, c => c.Name); T type argument is inferred to Customer based on source argument type Sequence.Select (customers, c => c.Name) c lambda expression argument type is infered to Customer Sequence.Select (customers, (Customer c) => c.Name) S type argument is inferred to string based on return value type of the lambda expression Sequence.Select (customers, (Customer c) => c.Name) Pavel Ježek C# 3.0 and.NET 3.5

Lambda Expressions: Expression Trees Permit lambda expressions to be represented as data structures instead of executable code Lambda expression convertible to delegate D (assignment causes code generation) is also convertible to expression tree (abstract syntax tree) of type System.Linq.Expressions.Expression (assignment causes expression tree generation) Expression trees are immutable IL_0000: ldarg.0 IL_0001: ldc.i4.2 IL_0002: add IL_0003: ldc.i4.s 10 IL_0005: mul IL_0006: stloc.0 IL_0007: br.s IL_0009 IL_0009: ldloc.0 IL_000a: ret LambdaExpression BinaryExpression ParameterExpression(“value”) ConstantExpression(2) ConstantExpression(10) Func f = Expression > e = value => (value + 2) * 1

Object Initializers Class representing a point: public class Point { private int x, y; public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } New instance can be created using object initializer: var a = new Point { X = 0, Y = 1 }; Which is equivalent to: var a = new Point(); a.X = 0; a.Y = 1; Pavel Ježek C# 3.0 and.NET 3.5

Object Initializers (2) Class representing a rectangle: public class Rectangle { private Point p1, p2; public Point P1 { get { return p1; } set { p1 = value; } } public Point P2 { get { return p2; } set { p2 = value; } } } New instance can be created using object initializer: var r = new Rectangle { P1 = new Point { X = 0, Y = 1 }, P2 = new Point { X = 2, Y = 3 } }; Which is equivalent to: var r = new Rectangle(); var __p1 = new Point(); __p1.X = 0; __p1.Y = 1; r.P1 = __p1; var __p2 = new Point(); __p2.X = 2; __p2.Y = 3; r.P2 = __p2; Pavel Ježek C# 3.0 and.NET 3.5

Object Initializers (3) Class representing a rectangle with constructor that allocates p1 and p2: public class Rectangle { private Point p1 = new Point(); private Point p2 = new Point(); public Point P1 { get { return p1; } } public Point P2 { get { return p2; } } } New instance can be created using object initializer: var r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } }; Which is equivalent to: var r = new Rectangle(); r.P1.X = 0; r.P1.Y = 1; r.P2.X = 2; r.P2.Y = 3; Pavel Ježek C# 3.0 and.NET 3.5

Collection Initializers Example: List digits = new List { 0, 1, 2}; Is equivalent to: List digits = new List (); digits.Add(0); digits.Add(1); digits.Add(2); List has to implement System.Collections.Generic.ICollection interface with the Add(T) method Pavel Ježek C# 3.0 and.NET 3.5

Combining Object and Collection Initializers Class representing a contact with name and list of phone numbers: public class Contact { private string name; private List phoneNumbers = new List (); public string Name { get { return name; } set { name = value; } } public List PhoneNumbers { get { return phoneNumbers; } } } List of contacts can be created and initialized with: var contacts = new List { new Contact { Name = "Chris Smith", PhoneNumbers = { " ", " " } }, new Contact { Name = "Bob Harris", PhoneNumbers = { " " } } }; Which is equivalent to: var contacts = new List (); var __c1 = new Contact(); __c1.Name = "Chris Smith"; __c1.PhoneNumbers.Add(" "); __c1.PhoneNumbers.Add(" "); contacts.Add(__c1); var __c2 = new Contact(); __c2.Name = "Bob Harris"; __c2.PhoneNumbers.Add(" "); contacts.Add(__c2); Pavel Ježek C# 3.0 and.NET 3.5

Auto-implemented Properties Backed up by a private field normally inaccessible to programmer (only via the property): class LightweightCustomer { public double TotalPurchases { get; set; } public string Name { get; private set; }// read-only public int CustomerID { get; private set; } // read-only } Pavel Ježek C# 3.0 and.NET 3.5

Anonymous Types Following expression: new { p1 = e1, p2 = e2, … pn = en } Can be used to define an anonymous type : class __Anonymous1 { private T1 f1 ; private T2 f2 ; … private Tn fn ; public T1 p1 { get { return f1 ; } set { f1 = value ; } } public T2 p2 { get { return f2 ; } set { f2 = value ; } } … public T1 p1 { get { return f1 ; } set { f1 = value ; } } } And create its instance using object initializer Different anonymous object initilizers that define properties with same names in the same order generate the same anonymous type: var p1 = new { Name = "Lawnmower", Price = }; var p2 = new { Name = "Shovel", Price = }; p1 = p2; Pavel Ježek C# 3.0 and.NET 3.5

Partial Methods Can appear only in partial classes or structs, and must be void, private and without out parameters: partial class A { string _name; partial void OnNameChanged(); public string Name { set { _name = value; OnNameChanged(); } partial class A { partial void OnNameChanged() { // Do something } Pavel Ježek C# 3.0 and.NET 3.5

Query Expressions – Examples Query expression: from c in customers where c.City == "London“ select c Gets translated to: customers.Where(c => c.City == "London") Pavel Ježek C# 3.0 and.NET 3.5

Query Expressions – Examples Query expression: from c in customers where c.City == "London“ select c.Name Gets translated to: customers.Where(c => c.City == "London").Select(c => c.Name) Pavel Ježek C# 3.0 and.NET 3.5

Query Expressions – Examples Query expression: from c in customers orderby c.Name select new { c.Name, c.Phone } Gets translated to: customers.OrderBy(c => c.Name).Select(c => new { Name = c.Name, Phone = c.Phone }) Pavel Ježek C# 3.0 and.NET 3.5

Query Expressions – Examples Query expression: from c in customers where c.City == "London" from o in c.Orders where o.OrderDate.Year == 2005 select new { c.Name, o.OrderID, o.Total } Gets translated to: customers.Where(c => c.City == "London"). SelectMany(c => c.Orders. Where(o => o.OrderDate.Year == 2005). Select(o => new { Name = c.Name, OrderID = o.OrderID, Total = o.Total }) ) Pavel Ježek C# 3.0 and.NET 3.5

Query Expressions Query expressions or LINQ (Language INtergrated Queries) are the key feature of.NET 3.5 Query expressions are translated to method calls – works on classes like: delegate R Func (A arg); class C { public C Where(Func predicate); public C Select (Func selector); public C SelectMany (Func > selector); public O OrderBy (Func keyExpr); public O OrderByDescending (Func keyExpr); public C > GroupBy (Func keyExpr); public C > GroupBy (Func keyExpr, Func elemExpr); } … Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Creating Entity Classes Only instances of “entity classes”, i.e. “entities”, can be stored in/retrieved from databases [Table] // Table is named “Customer” public class Customer { public string CustomerID; // Transient data not stored in DB public string City; // Transient data not stored in DB } [Table(Name="Customers")] public class Customer { public string CustomerID; // Transient data not stored in DB public string City; // Transient data not stored in DB } [Table(Name="Customers")] public class Customer { [Column(Id=true)] // Part of database primary key public string CustomerID; [Column] public string City; } Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL - DataContext DataContext is equivalent of ADO.NET connection It retrieves data (objects) from the database and submits changes It translates requests (queries) for objects into SQL queries Using the DataContext to retrieve customer objects whose city is London: // DataContext takes a connection string DataContext db = newDataContext("c:\\northwind\\northwnd.mdf"); // Get a typed table to run queries Table Customers = db.GetTable (); // Query for customers from London var q = from c in Customers where c.City == "London" select c; foreach (var cust in q) { Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City); } Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Strongly Typed DataContext public partial class Northwind : DataContext { public Table Customers; public Table Orders; public Northwind(string connection): base(connection) {} } Retrieving customer objects whose city is London more easily: Northwind db = new Northwind("c:\\northwind\\northwnd.mdf"); var q =from c in db.Customers where c.City == "London“ select c; foreach (var cust in q) { Console.WriteLine("id = {0}, City = {1}",cust.CustomerID, cust.City); } Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Query Execution Queries are not imperative – they are not executed immediately var q =from c in db.Customers where c.City == "London" select c; Only creates an instance of IQueryable type and assigns it to q When the application tries to enumerate the contents of a query, it gets executed (i.e. deferred execution): // Execute first time foreach (Customer c in q) Console.WriteLine(c.CompanyName); // Execute second time foreach (Customer c in q) Console.WriteLine(c.CompanyName); Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Query Execution Queries are not imperative – they are not executed immediately var q =from c in db.Customers where c.City == "London" select c; Only creates an instance of IQueryable type and assigns it to q When the application tries to enumerate the contents of a query, it gets executed (i.e. deferred execution): // Execute db.Log = Console.Out; foreach (Customer c in q) Console.WriteLine(c.CompanyName); Standard output: SELECT [t0].[EmployeeID], [t0].[LastName], [t0].[FirstName], [t0].[Title], [t0].[TitleOfCourtesy], [t0].[BirthDate], [t0].[HireDate], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[HomePhone], [t0].[Extension], [t0].[Photo], [t0].[Notes], [t0].[ReportsTo], [t0].[PhotoPath] FROM [dbo].[Employees] AS [t0] WHERE [t0].[City] Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London] Pavel Ježek C# 3.0 and.NET 3.5

Expression Trees Permit lambda expressions to be represented as data structures instead of executable code Lambda expression convertible to delegate D (assignment causes code generation) is also convertible to expression tree (abstract syntax tree) of type System.Linq.Expressions.Expression (assignment causes expression tree generation) Expression trees are immutable Pavel Ježek C# 3.0 and.NET 3.5 IL_0000: ldarg.0 IL_0001: ldc.i4.2 IL_0002: add IL_0003: ldc.i4.s 10 IL_0005: mul IL_0006: stloc.0 IL_0007: br.s IL_0009 IL_0009: ldloc.0 IL_000a: ret LambdaExpression BinaryExpression ParameterExpression(“value”) ConstantExpression(2) ConstantExpression(10) Func f = Expression > e = value => (value + 2) * 1

LINQ to SQL – Advantage of Deferred Execution Partial query contruction: var q =from c in db.Customers where c.City == "London" select c; if (orderByLocation) { q =from c in q orderby c.Country, c.City select c; } else if (orderByName) { q =from c in q orderby c.ContactName select c; } foreach (Customer c in q) Console.WriteLine(c.CompanyName); Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Avoiding Deferred Execution Query can be converted to standard collection classes using ToList() or ToArray() Standard Query Operators – leads to immediate execution: var q =from c in db.Customers where c.City == "London" select c; // Execute once using ToList(), ToArray() var list = q.ToList(); foreach (Customer c in list) Console.WriteLine(c.CompanyName); Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Defining Relationships [Table(Name="Customers")] public class Customer { [Column(Id=true)] public string CustomerID;... private EntitySet _Orders; [Association(Storage="_Orders", OtherKey="CustomerID")] public EntitySet Orders { get { return this._Orders; } set { this._Orders.Assign(value); } } [Table(Name="Orders")] public class Order { [Column(Id=true)] public int OrderID; [Column] public string CustomerID; private EntityRef _Customer; [Association(Storage="_Customer", ThisKey="CustomerID")] public Customer Customer { get { return this._Customer.Entity; } set { this._Customer.Entity = value; } } Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Querying Across Relationships Query using the Orders property to form the cross product between customers and orders, producing a new sequence of Customer and Order pairs: var q =from c in db.Customers from o in c.Orders where c.City == "London" select new { c, o }; Another query producing the same result: var q =from o in db.Orders where o.Customer.City == "London" select new { c = o.Customer, o }; Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Modifying Entities Northwind db = new Northwind("c:\\northwind\\northwnd.mdf"); // Query for a specific customer string id = "ALFKI"; var cust = db.Customers.Single(c => c.CustomerID == id); // Change the name of the contact cust.ContactName = "New Contact"; // Delete an existing Order Order ord0 = cust.Orders[0]; // Removing it from the table also removes it from the Customer’s list db.Orders.Remove(ord0); // Create and add a new Order to Orders collection Order ord = new Order { OrderDate = DateTime.Now }; cust.Orders.InsertOnSubmit(ord); // Ask the DataContext to save all the changes – generates appropriate SQL command db.SubmitChanges(); Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Creating Simple Databases [Table(Name="DVDTable")] public class DVD { [Column(Id = true)] public string Title; [Column] public string Rating; } public class MyDVDs : DataContext { public Table DVDs; public MyDVDs(string connection) : base(connection) {} } // Creating a new database MyDVDs db = new MyDVDs("c:\\mydvds.mdf"); db.CreateDatabase(); // Replacing an existing one MyDVDs db = new MyDVDs("c:\\mydvds.mdf"); if (db.DatabaseExists()) { db.DeleteDatabase(); } db.CreateDatabase(); Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Inheritance [Table] [InheritanceMapping(Code = "C", Type = typeof(Car))] [InheritanceMapping(Code = "T", Type = typeof(Truck))] [InheritanceMapping(Code = "V", Type = typeof(Vehicle), IsDefault = true)] public class Vehicle { [Column(IsDiscriminator = true)] public string Key; [Column(Id = true)] public string VIN; [Column] public string MfgPlant; } public class Car : Vehicle { [Column] public int TrimCode; [Column] public string ModelName; } public class Truck : Vehicle { [Column] public int Tonnage; [Column] public int Axles; } Pavel Ježek C# 3.0 and.NET 3.5

LINQ to SQL – Inheritance Pavel Ježek C# 3.0 and.NET 3.5 Example queries: var q = db.Vehicle.Where(p => p is Truck); var q = db.Vehicle.OfType (); var q = db.Vehicle.Select(p => p as Truck).Where(p => p != null); foreach (Truck p in q) Console.WriteLine(p.Axles);

LINQ to SQL – Query Visualizer in VS static void Main(string[] args) { Northwnd db = new files\linq preview\data\northwnd.mdf"); var q = from c in db.Customers where c.City == "London" select c; } // Breakpoint Pavel Ježek C# 3.0 and.NET 3.5