900 likes | 1.06k Views
Language Integrated Query in .NET (LINQ). Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations. http://schoolacademy.telerik.com. Svetlin Nakov. Telerik Corporation. www.telerik.com. Table of Contents. Extension Methods Anonymous Types
E N D
Language Integrated Query in .NET (LINQ) Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations http://schoolacademy.telerik.com Svetlin Nakov Telerik Corporation www.telerik.com
Table of Contents • Extension Methods • Anonymous Types • Lambda Expressions • LINQ Building Blocks • Query Operators and Expressions • Query Expression Trees • LINQ to Objects: Querying Collections • Projection, Conversion, Aggregation • Sorting, Grouping, Joins, Nested Queries
Extension Methods • Once a type is defined and compiled into an assembly its definition is, more or less, final • The only way to update, remove or add new members is to recode and recompile the code • Extension methods allow existing compiled types to gain new functionality • Without recompilation • Without touching theoriginal assembly
Defining Extension Methods • Extension methods • Defined in a static class • Defined as static • Use thiskeyword before its first to specify the class to be extended • Extension methods are "attached" to the extended class • Can also be called from statically through the defining static class
Extension Methods – Examples public static class Extensions { public static int WordCount(thisstring str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } ... static void Main() { string s = "Hello Extension Methods"; int i = s.WordCount(); Console.WriteLine(i); }
Extension Methods – Examples (2) public static void IncreaseWidth( this IList<int> list, int amount) { for (int i = 0; i < list.Count; i++) { list[i] += amount; } } ... static void Main() { List<int> ints = new List<int> { 1, 2, 3, 4, 5 }; ints.IncreaseWidth(5); // 6, 7, 8, 9, 10 }
Extension Methods Live Demo
Anonymous Types • Anonymous types • Encapsulate a set of read-only properties and their value into a single object • No need to explicitly define a type first • To define an anonymous type • Use of the new var keyword in conjunction with the object initialization syntax var point = new { X = 3, Y = 5 };
Anonymous Types – Example • At compile time, the C# compiler will autogeneratean uniquely named class • The class name is not visible from C# • Using implicit typing (var keyword) is mandatory // Use an anonymous type representing a car var myCar = new { Color = "Red", Brand = "BMW", Speed = 180 }; Console.WriteLine("My car is a {0} {1}.", myCar.Color, myCar.Brand);
Anonymous Types – Properties • Anonymous types are reference types directly derived from System.Object • Have overridden version of Equals(), GetHashCode(), and ToString() • Do not have == and != operators overloaded var p = new { X = 3, Y = 5 }; var q = new { X = 3, Y = 5 }; Console.WriteLine(p == q); // false Console.WriteLine(p.Equals(q)); // true
Arrays of Anonymous Types • You can define and use arrays of anonymous types through the following syntax: var arr = new[] { new { X = 3, Y = 5 }, new { X = 1, Y = 2 }, new { X = 0, Y = 7 } }; foreach (var item in arr) { Console.WriteLine("({0}, {1})", item.X, item.Y); }
Anonymous Types Live Demo
Lambda Expressions • A lambda expression is an anonymous function containing expressions and statements • Used to create delegates or expression tree types • All lambda expressions use the lambda operator =>, which is read as "goes to" • The left side of the lambda operator specifies the input parameters • The right side holds the expression or statement
Lambda Expressions – Examples • Usually used with collection extension methods like FindAll() and Count() List<int> list = new List<int>() { 1, 2, 3, 4 }; List<int> evenNumbers = list.FindAll(x => (x % 2) == 0); foreach (var num in evenNumbers) { Console.Write("{0} ", num); } Console.WriteLine(); // 2 4 list.RemoveAll(x => x > 3); // 1 2 3
Sorting with Lambda Expression var pets = new Pet[] { new Pet { Name="Sharo", Age=8 }, new Pet { Name="Rex", Age=4 }, new Pet { Name="Strela", Age=1 }, new Pet { Name="Bora", Age=3 } }; var sortedPets = pets.OrderBy(pet => pet.Age); foreach (Pet pet in sortedPets) { Console.WriteLine("{0} -> {1}", pet.Name, pet.Age); }
Lambda Code Expressions • Lambda code expressions: List<int> list = new List<int>() { 20, 1, 4, 8, 9, 44 }; // Process each argument with codestatements List<int> evenNumbers = list.FindAll((i) => { Console.WriteLine("value of i is: {0}", i); return (i % 2) == 0; }); Console.WriteLine("Your even numbers are:"); foreach (int even in evenNumbers) Console.Write("{0}\t", even);
Delegates Holding Lambda Functions • Lambda functions can be stored in variables of type delegate • Delegates are typed references to functions • Standard function delegates in .NET: • Func<TResult>, Func<T,TResult>, Func<T1,T2,TResult>, … Func<bool> boolFunc = () => true; Func<int, bool> intFunc = (x) => x < 10; if (boolFunc() && intFunc(5)) Console.WriteLine("5 < 10");
Lambda Expressions Live Demo
LINQ and Query Keywords • Language Integrated Query (LINQ) query keywords • from – specifies data source and range variable • where – filters source elements • select – specifies the type and shape that the elements in the returned sequence • group– groups query results according to a specified key value • orderby – sorts query results in ascending or descending order
Query Keywords – Examples • select, fromand where clauses: int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var querySmallNums = from num in numbers where num < 5 select num; foreach (var num in querySmallNums) { Console.Write(num.ToString() + " "); } //The result is 4 1 3 2 0
Query Keywords – Examples (2) • Nested queries: string[] towns = { "Sofia", "Varna", "Pleven", "Ruse", "Bourgas" }; var townPairs = from t1 in towns from t2 in towns select new { T1 = t1, T2 = t2 }; foreach (var townPair in townPairs) { Console.WriteLine("({0}, {1})", townPair.T1, townPair.T2); }
Query Keywords – Examples (3) • Sorting with оrderby: string[] fruits = { "cherry", "apple", "blueberry", "banana" }; // Sort in ascending sort var fruitsAscending = from fruit in fruits orderby fruit select fruit; foreach (string fruit in fruitsAscending) { Console.WriteLine(fruit); }
LINQ Query Keywords Live Demo
LINQ Building Blocks • Software developers spend a lot of time to obtain and manipulate data • Data can be stored in • Collections • Databases • XML documents • etc... • As of .NET 3.5 developers can use LINQ – a simplified approach to data manipulation
LINQ Building Blocks (2) • LINQ is a set of extensions to .NET Framework • Encompasses language-integrated query, set, and transform operations • Consistent manner to obtain and manipulate "data" in the broad sense of the term • Queryexpressionscan be defined directly within the C# programming language • Used to interact with numerous data types • Converted to expression trees at compile time and evaluated at runtime
LINQ Building Blocks (3) • LINQ allows query expressions to manipulate: • Any object implementing IEnumerable<T> • Collections of objects • Relational databases • XML documents • The query expressions are based on numerous SQL-like query operators • Intentionally designed to look and feel very similar to SQL expressions
LINQ Building Blocks (4) • "LINQ" is the term used to describe this overall approach to data access • LINQ to Objects • LINQ over objects implementing IEnumerable<T> • LINQ to SQL and LINQ to Entities implement LINQ over relational data • LINQ to DataSetis a superset of LINQ to SQL • LINQ to XML is LINQ over XML documents
LINQ to * Others … • VB.NET C# .NET Language-Integrated Query (LINQ) LINQ enabled data sources LINQ enabled ADO.NET LINQ to XML LINQ to Objects LINQ to DataSets LINQ to Entities LINQ to SQL <book> <title/> <author/> <price/> </book> Objects XML Relational Data
Query Operations • All LINQ query operations consist of three distinct actions: • Obtain the data source • Create the query • Execute the query
IEnumerable<T> and Sequences • The interface IEnumerable<T> is universal LINQ data source • Implemented by arrays and all .NET generic collections • Enables enumerating over a collection of elements • A sequencein LINQ means a collection implementing the IEnumerable<T>interface • Any variable declared as IEnumerable<T> for type T is considered a sequence of type T
IEnumerable<T> and Sequences (2) • Most of the Standard Query Operators are extension methods in the static class System.Linq.Enumerable • Prototyped with an IEnumerable<T> as their first argument • E.g. Min(IEnumerable<T>), Where(IEnumerable<T>,Func<T,bool>) • Use the Cast or OfType operators to perform LINQ queries on legacy, non-generic .NET collections
LINQ Query Expressions • When you have a collection of data, a common task is to extract a subset of items based on a given requirement • You want to obtain only the items with names that contain a number • Or don’t have embedded spaces • LINQ query expressions can greatly simplify the process • Query expressions are written in a declarative query syntax introduced in C# 3.0
LINQ Query Expressions (2) • LINQ query expressions are written in a declarative SQL-like syntax • Example: extracting a subset of array containing items with names of more than 6 characters: string[] games ={"Morrowind", "BioShock","Daxter", "The Darkness","Half Life", "System Shock 2"}; IEnumerable<string> subset = from g in games where g.Length > 6 orderby g select g; foreach (string s in subset) Console.WriteLine("Item: {0}", s);
Query Expressions Live Demo
LINQ Query Expressions (3) • In LINQ a query is a basic language construction • Just like classes, methods and delegates in C# • Query expressions are used to query and transform data from any LINQ-enabled data source • A LINQ query is not executed until • You iterate over the query results • You try to access any of the elements in the result set
Query Operators and the LINQ Extension Methods • Query operators in C# are keywords like: • from, in, where, orderby, select, … • For each standard query operator a corresponding extension method exists • E.g. where Where(IEnumerable<T>) • At compile time the C# compiler translates query expressions into expression trees • Expression trees are sequences of method calls (from System.Linq.Enumerable)
Query Operators – Syntax • The basic syntax of LINQ queries is: • This selects all elements in games data source • You can apply criteria by the operator where • Any valid C# boolean expression can be used IEnumerable<string> subset = from g in games select g; var subset = games.Select(g => g); IEnumerable<string> subset = from g in games where g.Price < 20 select g; var subset = games.Select(g => g). Where(g => g.Price < 20);
Query Operators (2) • Two sets of LINQ standard operators • Operating on IEnumerable<T> • Operating on IQueryable<T> • LINQ query operators are shorthand versions for various extension methods • Defined in System.Linq.Enumerabletype • Example: var subset = from g in games where g.Price < 20 select g; IEnumerable<string> subset = games.Where(g => g.Price < 20);
Query Operators (3) • The standard query operators provide query capabilities including • Filtering – where • Projection – select, selectMany • Aggregation – Sum, Max, Count, Average • Sorting – orderby • Grouping – groupby • … and many more
Standard Query Operators – Example string[] games = {"Morrowind", "BioShock","Half Life", "The Darkness","Daxter", "System Shock 2"}; // Build a query expression using extension methods // granted to the Array via the Enumerable type var subset = games.Where(game => game.Length >6). OrderBy(game => game).Select(game => game); foreach (var game in subset) Console.WriteLine(game); Console.WriteLine(); var subset = from g in games where g.Length > 6 orderby g select g;
Standard Query Operators Live Demo
Query Expression Trees • A queryexpression tree is an efficient data structure representing a LINQ expression • Type of abstract syntax tree used for storing parsed expressions from the source code • Lambda expressions often translate into query expression trees • IQueryable<T>is interface implemented by query providers (e.g. LINQ to SQL, LINQ to XML, LINQ to Entities) • IQueryable<T> objects use expression trees