1 / 51

LINQ: Language-Integrated Queries (To be included in C # 3.0)

LINQ: Language-Integrated Queries (To be included in C # 3.0). Technology developed by Anders Hejlsberg & friends at Microsoft (2005) Presented by Tal Cohen. LINQ. A C # language extension: Use SQL-like syntax in C # . Outline: Examples Understanding the witchcraft Delegate functions

sine
Télécharger la présentation

LINQ: Language-Integrated Queries (To be included in C # 3.0)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. LINQ:Language-Integrated Queries(To be included in C# 3.0) Technology developed by Anders Hejlsberg & friends at Microsoft (2005) Presented by Tal Cohen

  2. LINQ • A C# language extension: • Use SQL-like syntax in C#. • Outline: • Examples • Understanding the witchcraft • Delegate functions • Lambda expressions • Type inference • Anonymous types • Extension methods • Expression trees

  3. Searching in Collections • Begin with a simple array of, say, Customers. Customer[] customers = new Customer[30]; customers[0] = new Customer(…); … customers[29] = new Customer(…);

  4. Searching in Collections:The Old Way • Find the names of all London customers: List<string> londoners = new List<string>(); foreach (Customer c in customers) { if (c.City == “London”) { londoners.add(c.Name); } }

  5. Searching in Collections:The LINQ Way Returns a simple array! string[] londoners = from c in customers where c.City == “London” select c.Name; Declarative! No loops! SQL-like!

  6. LINQ: How Does It Work? • LINQ syntax = shorthand for method invocation. • “Translation maps”

  7. Syntax Translation Example string[] londoners = from c in customers where c.City == “London” select c.Name; string[] londoners = customers. Where(expression). Select(expression);

  8. Translating Expressions • Problem: Translating “c.City == “London”” to an expression e, such that Where(e) is valid?

  9. Expressions == Methods? • Where() wants a Boolean method. • The method acts as a filter. • Likewise for Select(): a translation method.

  10. C# Delegates • C#delegates: method pointers. class Demo { delegatevoid Foo(); void Bar() { … do something … }; void Test() { Foo myDelegate = new Foo(Bar); // “pointer” to Bar() myDelegate(); // invoke } }

  11. Delegates as Arguments • Delegates can be passed as arguments. • Event handlers, jobs for threads, etc. class Demo { void Job() { … the job to carry out … }; void Test() { Thread worker = new Thread( new ThreadStart(Job)); worker.start(); } }

  12. Anonymous Methods • Nameless methods = on-the-fly delegates: class Demo { delegatevoid Foo(); void Test() { Foo myDelegate = delegate(){ … do something … }; myDelegate(); // invoke } }

  13. Syntax Translation Example string[] londoners = from c in customers where c.City == “London” select c.Name; string[] londoners = customers. Where(delegate(Customer c) { return c.City == “London”; }). Select(delegate(Customer c) { return c.Name });

  14. Well, Not Really. • Where(), etc. accept delegate methods. • But LINQ creates lambda expressions. • Seamless conversion.

  15. Syntax Translation Example string[] londoners = from c in customers where c.City == “London” select c.Name; string[] londoners = customers. Where(c => c.City == “London”). Select(c => c.Name);

  16. Lambda Expressions Shades of ML… • Lambda expression syntax: (argumentList) =>expression oneArgument=>expression • Arguments optionally typed. • Type inference mechanism. • More on that later…

  17. Where’s Where()? • We invoked Where() on Customers[]. • On the resulting Customers[], we invoked Select(). • New methods for arrays!?

  18. Extension Methods class Utils { publicstatic firstChar(thisstring s) { return s.charAt(0); } } • So far, just a simple static method. • Can be used like any other.

  19. Extension Methods • But now… Using Utils; class Demo { void Foo() { string s = “Hello”; Console.WriteLine(s.firstChar()); } }

  20. Extension Methods • Static methods that seem to extend existing types. • Where(), Select(), etc. extend IEnumerable<T>. • Defined in System.Query. • Applicable to one-dimensional array types.

  21. Query Your Own Types! • LINQ can be applied to any type. • Just implement Where(), Select(), etc.

  22. LINQ and Relational Data • Let’s obtain a DB-table type, and query it. DbCustomers c = new DbCustomers(“my.mdb”); string[] londoners = from c in customers where c.City == “London” select c.Name;

  23. This Makes No Sense! • But…Where() applies the filter to every record. • … on the client! • SELECT * FROM CUSTOMERS, and filter with a simple loop!?

  24. Back To Lambda Expressions • Lambda expressions can be converted to anonymous methods. • Can also be converted to expression trees. • A run-time representation of the syntax tree.

  25. Example… • Our code yields: string[] londoners = customers. Where(c => c.City == “London”). Select(c => c.Name); where “customers” is of type DbCustomers. • No DbCustomers.Where(delegate(Customer c)) method exists. • However: DbCustomers.Where( Expression<Func<Customer,bool>> xt)

  26. Expression Trees • A data type. • Represents lambda expressions at runtime. • Used it to generate SQL at runtime. • Guaranteed to be valid.

  27. Relational Algebra:Joins, Projections

  28. Multiple Generators(Cartesian Product / Join) OrderData[] od = from c in customers where c.City == “London” from o in c.Orders where o.OrderDate.Year == 2005 selectnew OrderData(c.Name, o.OrderId, o.Total); OrderData[] od = customers. Where(c => c.City == “London”). SelectMany(c => c.Orders. Where(o => o.OrderDate.Year == 2005). Select(o => new OrderData(c.Name, o.OrderId, o.Total)) );

  29. Projections • Using LINQ’s select: from c in customers where c.City == “London” select new AddressBookEntry(c.Name, c.Phone);

  30. Pre-Defined Types Only? • But… The projection type (e.g., AddressBookEntry) must be pre-defined!

  31. Ad-Hoc Types Must not be null-typed. • new { [name1=]expr1,…,[namen=]exprn} • Type implied by types of exprs. • Example: from c in customers where c.City == “London” selectnew { c.Name, c.Phone }; If name is not specified, and expr is either property or x.property, then property’s name will be used.

  32. Ad-Hoc Types are Nameless • How do we store the result? ??? q = from … selectnew {…}; • The ad-hoc type is nameless! • Can’t use Object • Can’t downcast to access the properties.

  33. Auto-Typed Variables • var x = 7;// x will be of type int • var q = from … selectnew {…}; // q will be an array of the anonymous type Console.WriteLine(q[0].Name); • Local variables only.

  34. Extra

  35. Relational Data in the OO World? • “Regular” LINQ queries yields “rectangular” data. • e.g., var od = from c in customers where c.City == “London” from o in c.Orders where o.OrderDate.Year == 2005 selectnew { c.Name, o.OrderId, o.Total }; = multiple lines per customer.

  36. Relational Data in the OO World?

  37. OO Data in the OO World! • Nested queries: var od = from c in customers where c.City == “London” selectnew { c.Name, Orders = from o in c.Orders where o.OrderDate.Year == 2005 select { o.OrderId, o.Total } };

  38. OO Data in the OO World!

  39. Ad-Hoc Type Equality • Two ad-hoc type expressions that have the same ordered set of property names and types share the same ad-hoc type. var p1 = new { Name = “Moo”, Age = 12 }; var p2 = new { Name = “Elk”, Age = 17 }; p1 = p2;

  40. Expression Tree Generation Expression<Func<int, bool>> exprLambda =x => (x & 1) == 0; ParameterExpression xParam = Expression.Parameter(typeof(int), "x"); Expression<Func<int, bool>> exprLambda = Expression.Lambda<Func<int, bool>>( Expression.EQ( Expression.BitAnd( xParam, Expression.Constant(1)), Expression.Constant(0)), xParam);

  41. String[] Clone Compare Format CopyTo Copy IndexOf IndexOf IndexOf Insert Substring Substring … Some LINQ Examples from m intypeof(string).getMethods select m.Name;

  42. Some LINQ Examples from m intypeof(string).getMethods where !m.IsStatic select m.Name; String[] Clone Compare CopyTo Copy IndexOf IndexOf IndexOf Insert Substring Substring …

  43. Some LINQ Examples from m intypeof(string).getMethods where !m.IsStatic orderby m.name select m.Name; String[] Clone Compare Copy CopyTo IndexOf IndexOf IndexOf Insert Substring Substring …

  44. Some LINQ Examples from m intypeof(string).getMethods where !m.IsStatic orderby m.name select m.Name groupby m.name; KeyGroupPairs[] Key = Clone Key = Compare Key = Copy Key = CopyTo Key = IndexOf Key = Insert Key = Substring … Group = … Group = … Group = … Group = … Group = … Group = … Group = … …

  45. Some LINQ Examples from m intypeof(string).getMethods where !m.IsStatic orderby m.name select m.Name groupby m.name into g selectnew { Method = g.Key, Overloads = g.Group.Count }; var[] Name = Clone Name = Compare Name = Copy Name = CopyTo Name = IndexOf Name = Insert Name = Substring … Overloads = 1 Overloads = 2 Overloads = 1 Overloads = 1 Overloads = 5 Overloads = 3 Overloads = 6 …

  46. Updates with LINQ? • Future feature: updating capabilities. from c in customers where c.City == “Peking” set c.City = “Beijing”; ??

  47. DLINQ • ADO.NET’s next-generation. • Among other features: a database-to-classes utility. • Class per DB table. • Property per DB column. • Foreign keys, etc. reflected in the classes. • Result: valid table/field names in the SQL.

  48. DLINQ – Roll Your Own • You can also define your own O/R mapping. • By adding attributes (metadata) to classes/fields. • Runtime error potential.

  49. Updates with DLINQ • DLINQ-generated classes include a change-tracking / DB updating mechanism. • a-la EJBs.

  50. XLINQ • Same idea, for searching in XML data.

More Related