extension methods, lambda expressions, linq operators, expressions, projections, aggregations...

90
Language Integrated Query in .NET (LINQ) Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Svetlin Nakov Telerik Corporation www.telerik. com http://schoolacademy.telerik.com

Upload: sabrina-harris

Post on 28-Dec-2015

248 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Language Integrated Query

in .NET (LINQ) Extension Methods, Lambda Expressions, LINQ

Operators, Expressions, Projections, Aggregations

Svetlin NakovTelerik Corporationwww.telerik.

com

http://schoolacademy.telerik.com

Page 2: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Table of Contents1. Extension Methods

2. Anonymous Types

3. Lambda Expressions

4. LINQ Building Blocks

5. Query Operators and Expressions

6. Query Expression Trees

7. LINQ to Objects: Querying Collections

8. Projection, Conversion, Aggregation

9. Sorting, Grouping, Joins, Nested Queries

2

Page 3: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Extension Methods

Page 4: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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 the

original assembly

4

Page 5: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Defining Extension Methods

Extension methods Defined in a static class Defined as static Use this keyword 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

5

Page 6: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Extension Methods – Examples

6

public static class Extensions{ public static int WordCount(this string str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; }} ...static void Main(){ string s = "Hello Extension Methods"; int i = s.WordCount(); Console.WriteLine(i);}

Page 7: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Extension Methods – Examples (2)

7

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}

Page 8: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Extension MethodsLive Demo

Page 9: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Anonymous Types

Page 10: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

10

var point = new { X = 3, Y = 5 };

Page 11: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Anonymous Types – Example

At compile time, the C# compiler will autogenerate an uniquely named class

The class name is not visible from C# Using implicit typing (var keyword)

is mandatory11

// Use an anonymous type representing a carvar myCar = new { Color = "Red", Brand = "BMW", Speed = 180 };

Console.WriteLine("My car is a {0} {1}.", myCar.Color, myCar.Brand);

Page 12: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

12

var p = new { X = 3, Y = 5 };var q = new { X = 3, Y = 5 };Console.WriteLine(p == q); // falseConsole.WriteLine(p.Equals(q)); // true

Page 13: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Arrays of Anonymous Types

You can define and use arrays of anonymous types through the following syntax:

13

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);}

Page 14: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Anonymous TypesLive Demo

Page 15: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Lambda Expressions

Page 16: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

16

Page 17: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Lambda Expressions – Examples

Usually used with collection extension methods like FindAll() and Count()

17

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

Page 18: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Sorting with Lambda Expression

18

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);}

Page 19: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Lambda Code Expressions

Lambda code expressions:

19

List<int> list = new List<int>() { 20, 1, 4, 8, 9, 44 };

// Process each argument with code statementsList<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);

Page 20: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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>, …

20

Func<bool> boolFunc = () => true;Func<int, bool> intFunc = (x) => x < 10;if (boolFunc() && intFunc(5)) Console.WriteLine("5 < 10");

Page 21: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Lambda ExpressionsLive Demo

Page 22: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ and Query Keywords

Page 23: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

23

Page 24: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Keywords – Examples

select, from and where clauses:

24

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

Page 25: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Keywords – Examples (2)

Nested queries:

25

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);}

Page 26: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Keywords – Examples (3)

Sorting with оrderby:

26

string[] fruits = { "cherry", "apple", "blueberry", "banana" };

// Sort in ascending sortvar fruitsAscending = from fruit in fruits orderby fruit select fruit;

foreach (string fruit in fruitsAscending){ Console.WriteLine(fruit);}

Page 27: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ Query KeywordsLive Demo

Page 28: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ Building Blocks

Page 29: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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 29

Page 30: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

Query expressions can 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

30

Page 31: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

31

Page 32: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, 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 DataSet is a superset of LINQ to SQL

LINQ to XML is LINQ over XML documents

32

Page 33: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to *

33

LINQ enabled data sources

LINQ to Objects

Objects

LINQto XML

<book> <title/> <author/> <price/></book>

XML

LINQ enabled ADO.NET

LINQ to DataSets

LINQto SQL

LINQ toEntities

Relational Data

Others …C# VB.NET

.NET Language-Integrated Query (LINQ)

Page 34: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Operations All LINQ query operations consist of three distinct actions:

1. Obtain the data source

2. Create the query

3. Execute the query

34

Page 35: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ Sequences

Page 36: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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 sequence in 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

36

Page 37: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

37

Page 38: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Operators and Expressions

Page 39: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

39

Page 40: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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:

40

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);

Page 41: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query ExpressionsLive Demo

Page 42: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

42

Page 43: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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)

43

Page 44: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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

44

IEnumerable<string> subset = from g in games select g;

IEnumerable<string> subset = from g in games where g.Price < 20 select g;

var subset = games.Select(g => g);

var subset = games.Select(g => g). Where(g => g.Price < 20);

Page 45: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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.Enumerable

type

Example:45

IEnumerable<string> subset = games.Where(g => g.Price < 20);

var subset = from g in games where g.Price < 20 select g;

Page 46: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

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 46

Page 47: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Standard Query Operators –

Example

47

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;

Page 48: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Standard Query Operators

Live Demo

Page 49: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Expression Trees

Page 50: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Expression Trees A query expression 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

50

Page 51: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Expression Trees (2)

LINQ queries can be performed over two standard .NET interfaces: IEnumerable<T>

At compile time IL is emitted

IQueryable<T>

At compile time a query expression tree is emitted

Both are evaluated at runtime

51

Page 52: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Query Expression Trees (3)

When any element of the IQueryable<T> result is being accessed for the first time A query is generated from the

expression tree and is executed

52

int[] nums = new int[] { 6, 2, 7, 1, 9, 3 };var numsLessThanFour = from i in nums where i < 4 select i;foreach (var item in numsLessThanFour) Console.WriteLine(item);

Query is generated

and executed here

Variable is of type

IQueryable<int>

Page 53: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Expression Trees – Benefits

IQueryable<T> uses expression trees which provide it mechanisms: For smart decisions and

optimizations when query is generated

Based on analysis of expression trees

Optimizing multiple nested or complex queries

Combining multiple queries into very efficient single one

53

Page 54: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to Objects

Page 55: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to Objects LINQ to Objects refers to using LINQ queries directly over IEnumerable<T> collection Without the an intermediate LINQ

provider or API, such as LINQ to SQL or LINQ to XML

Applicable to any enumerable collection

The old school data retrieval approach Write complex foreach loops that

specify how to retrieve data from a collection

Тhe LINQ approach – write declarative code that describes what to be retrieved

55

Page 56: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to Objects – Advantages

LINQ queries offer three main advantages over traditional foreach loops They are more concise and easy-to-

read

Especially when filtering by multiple conditions

Provide powerful filtering, ordering, and grouping capabilities

Can be ported to other data sources with little or no modification

56

Page 57: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to Objects – Example

LINQ to Objects is performing SQL-like queries on in-memory data collections and arrays

57

string[] presidents = { "Adams", "Arthur", "Buchanan", "Bush", "Carter","Cleveland","Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield","Grant", "Harding", "Harrison", "Hayes", "Hoover", "Jackson", "Jefferson", "Johnson", "Kennedy", "Lincoln", "Madison", "McKinley", "Monroe", "Nixon", "Pierce", "Polk", "Reagan", "Roosevelt", "Taft", "Taylor", "Truman", "Tyler", "Van Buren", "Washington", "Wilson"};string president = presidents.Where(p => p.StartsWith("Lin")).First();Console.WriteLine(president);

string president = (from p in presidents where p.StartsWith("Lin") select p).First();

Page 58: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ to Objects

Live Demo

Page 59: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Counting the Occurrences of a

Word in a String – Example

59

string text = "Historically, the world of data …";…

string searchTerm = "data";string[] source = text.Split( new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);

// Use ToLower() to match both "data" and "Data"var matchQuery = from word in text where word.ToLower() == searchTerm.ToLower() select word;int wordCount = matchQuery.Count();

int wordCount = text.Select( w => w.toLower() == searchTerm.ToLower()).Count();

Page 60: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Count the Occurrences of a Word in a String

Live Demo

Page 61: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying

Collections

Page 62: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Collections What can we query?

Not everything can be queried by LINQ to Objects

The objects need to be a collection It must implement the IEnumerable<T> interface

The good news Almost all standard collections

in .NET Framework implements IEnumerable<T>

62

Page 63: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Collections (2)

What can be queried using LINQ to Objects? Arrays – T[]

Generic lists – List<T>

Generic dictionaries – Dictionary<K,V>

Strings – string

Other collections that implements IEnumerable<T>

63

Page 64: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Arrays Any kind of arrays can be used with LINQ Can be even an untyped array of

objects

Queries can be applied to arrays of custom objects

Example:

64

Book[] books = { new Book { Title="LINQ in Action" }, new Book { Title="LINQ for Fun" }, new Book { Title="Extreme LINQ" } };var titles = books .Where(book => book.Title.Contains("Action")) .Select(book => book.Title);

var titles = from b in books where b.Title.Contains("Action") select b.Title;

Page 65: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Generic Lists The previous example can be adapted to work with a generic list List<T>, LinkedList<T>, Queue<T>, Stack<T>, HashSet<T>, etc.

65

List<Book> books = new List<Book>() { new Book { Title="LINQ in Action" }, new Book { Title="LINQ for Fun" }, new Book { Title="Extreme LINQ" } };var titles = books .Where(book => book.Title.Contains("Action")) .Select(book => book.Title);

Page 66: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Generic Lists

Live Demo

Page 67: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Querying Strings Although System.String may not be perceived as a collection at first sight It actually is a collection, because it

implements IEnumerable<char> String objects can be queried with LINQ to Objects, like any other collection

67

var count = "Non-letter characters in this string: 8" .Where(c => !Char.IsLetter(c)) .Count();Console.WriteLine(count);

// The result is: 8

var count = (from c in "Non-letter…" where !Char.IsLetter(c) select c).Count();

Page 68: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

LINQ Operations

Page 69: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Aggregation Operations An aggregation operation computes a single value from a collection of values

Example of aggregation of field over a sequence of employees

69

Name SalaryBay Ivan 12500,0

0

Bat Rambo 13500,00

Baba Yaga 43300,00

Kiro the King

29800,00

Bay Mangal

25000,00

... ...

MAX(Salary)125500,00

Page 70: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Aggregation Methods Average()

Calculates the average value of a collection

Count() Counts the elements in a collection

Max() Determines the maximum value in a

collection Sum()

Sums the values in a collection70

Page 71: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Aggregation Methods – Examples

Count(<condition>)

Max()

71

double[] temperatures = {28.0, 19.5, 32.3, 33.6, 26.5, 29.7};int highTempCount = temperatures.Count(p => p > 30);Console.WriteLine(highTempCount);// The result is: 2

double[] temperatures = {28.0, 19.5, 32.3, 33.6, 26.5, 29.7};double maxTemp = temperatures.Max();Console.WriteLine(maxTemp);// The result is: 33.6

var highTemp = (from p in temperatures where p > 30 select p).Count();

var highTemp = (from p in temperatures select p).Max();

Page 72: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Projections Projection refers to the act of transforming the elements of a collection into a different type The resulting type is defined by the

developer Projection operators in LINQ

Select – projects single values that are based on a transform function

SelectMany – projects collections of values into a new collection containing all values

72

Page 73: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Projections – Examples Select(<transform-function))

73

List<string> words = new List<string>() { "an", "apple", "a", "day" };var query = from word in words select word.Substring(0, 1);

foreach (string s in query){ Console.Write("{0} ", s);}// The result is: a a a d

var query = words.Select(w => w.Substring(0,1));

Page 74: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Projections – Examples (2)

SelectMany(<multi-value-function>)

74

string[] sentence = new string[] { "The quick brown", "fox jumped over", "the lazy dog"};

// SelectMany returns nine strings// (sub-iterates the Select result)IEnumerable<string> allWords = sentence.SelectMany(segment => segment.Split(' '));

foreach (var word in allWords) Console.Write(" {0}", word);

// Result: The quick brown fox jumped over the lazy dog

No LINQ equvalen

t

Page 75: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

ProjectionsLive Demo

LINQ

Page 76: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Conversions Converting a collection to a different type Can change the type of the

collection

Can change the type of the elements

Conversion operations in LINQ queries are useful in a variety of applications

For example: Enumerable.AsEnumerable<TSource> Enumerable.OfType<(TResult)> Enumerable.ToArray(TSource)

76

Page 77: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Conversion Methods If start with "As"

Change the static type of the source collection but do not enumerate it

If start with "To" Enumerate the source collection

and turn each item into the corresponding collection type

77

string[] towns = {"Sofia", "Plovdiv", "Varna", "Bourgas", "Pleven"};IEnumerable<string> strings = towns.AsEnumerable<string>();List<string> list = towns.ToList();

Page 78: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Sorting A sorting operation orders the elements of a sequence based on one or more attributes

Standard query operator OrderBy(…) OrderByDescending(…) ThenBy(…) – performs a secondary

sort in ascending order

ThenByDescending(…) Reverse(…) 78

Page 79: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Sorting – Example

79

string[] words = { "Bay Kolio", "Pinokio", "Dedo Mraz", "Baba Yaga", "Bay Mangal" };IEnumerable<string> query = from word in words orderby word.Length, word.Substring(0, 1) descending select word;

foreach (string str in query) Console.WriteLine(str);/* The result is: Pinokio Dedo Mraz Bay Kolio Baba Yaga Bay Mangal*/

var query = words.Select(word => word). OrderBy(word => word.Length). ThenByDescending( word => word.Substring(0, 1));

Page 80: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Grouping Operation of putting data into groups The elements in each group share a

common value for some attribute Example

80

Page 81: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Creating Groups and Maps

GroupBy() Groups elements that share a

common attribute, called key

Each group is represented by a sequence of IGrouping(TKey,TElement) objects

ToLookup() Inserts elements into a Lookup(TKey, TElement) based on a key selector function

Distinct() Returns distinct elements form a

collection

81

Page 82: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Group By – Examples

82

var people = new[] { new { Name = "Kiki", Town = "Plovdiv"}, new { Name = "Pepi", Town = "Sofia"}, new { Name = "Koko", Town = "Sofia"}, new { Name = "Mimi", Town = "Plovdiv"}};

var peopleByTowns = from p in people group p by p.Town;

foreach (var town in peopleByTowns){ Console.Write("Town {0}: ", town.Key); foreach (var person in town) Console.Write("{0} ", person.Name); Console.WriteLine();}

var peopleByTowns = people.GroupBy(t => t.Town);

Page 83: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Group By – Examples (2)

83

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

var numberGroups = from n in numbers group n by n % 3;

foreach (var g in numberGroups){ Console.Write("Remainder: {0} -> ", g.Key); foreach (var n in g) Console.Write("{0} ", n); Console.WriteLine();}// Remainder: 2 -> 5 8 2// Remainder: 1 -> 4 1 7// Remainder: 0 -> 3 9 6 0

var numberGroups = numbers.GroupBy(n => n % 3);

Page 84: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Joins Action of relating or associating one data source object with a second data source object

The two data source objects are associated through a common value or attribute

84

Page 85: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Join Methods Join

Joins two sequences based on key selector function

And extracts the joined pairs of values

GroupJoin Joins two sequences based on key

selector functions

And groups the resulting matches for each element

85

Page 86: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Joins – Example

86

var owners = new[] { new { Name = "Koko", Town = "Plovdiv"}, new { Name = "Pepi", Town = "Sofia"},};

var pets = new[] { new { Name = "Sharo", Owner = owners[0] }, new { Name = "Rex", Owner = owners[1] }, new { Name = "Poohy", Owner = owners[0] },};

var petsWithOwners = from o in owners join p in pets on o.Name equals p.Owner.Name select new { Owner = o.Name, Pet = p.Name };

foreach (var p in petsWithOwners) Console.WriteLine("{0} owned by {1}", p.Pet, p.Owner);

var petsWithOwners = owners.Join(pets, (o => o.Name), (p => p.Owner.Name), (o, p) => new {o.Name, p.Name });

Page 87: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

JoinsLive Demo

Page 88: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Nested Queries The queries can be nested For example:

Suppose we have collections of Person and collections of Role objects

We want get all roles for given person (ID = 1)

88

var query = people .Where(p => p.ID == 1) .SelectMany(p => roles .Where(r => r.ID == p.RoleID) .Select(r => new { p.FirstName, p.LastName, r.Role }));

Page 89: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Nested QueriesLive Demo

Page 90: Extension Methods, Lambda Expressions, LINQ Operators, Expressions, Projections, Aggregations Extension Methods, Lambda Expressions, LINQ Operators, Expressions,

Questions? ??

? ? ??

??

?

http://schoolacademy.telerik.com

Language Integrated Query

in .NET (LINQ)