Select and SelectMany: LINQ projection operator

Projection transforms the query result into the form defined by the developer. There are two projection operators in LINQ

image

Let us say, there is a class

clip_image004

And a function returning List<Student> as below,

clip_image006

Select operator

Below query will return name and roll number of all the students.

clip_image008

Output

clip_image010

Below query will project name of the student’s starts with D.

clip_image012

Output

clip_image014

Above was very simple query let us modify the display function and try to display subject of the student

clip_image015

Output

clip_image017

If you notice the above output, we are not getting the proper output and it is saying that Subject is generic list. So to fetch we need to enumerate through the list.

Now question is how to retrieve all the subjects of students?

SelectMany

So to retrieve query from more than one collection SelectMany come into action.

clip_image019

Above query will return the entire subjects of all the students.

clip_image021

The other way to apply SelectMany operator is directly apply on the retrieval query as below,

clip_image023

Output

clip_image025

Full Source code is as below,

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication9

{

class Program

{

static void Main(string[] args)

{

// Reteriving all students with name D

var result1 = from r in GetStudents()

where r.Name.StartsWith("D")

select r;

foreach (var r in result1)

{

Console.WriteLine(r.Name);

}

// Reteriving  the result in Anonymous  class

var result2 = from r in GetStudents()

select new { r.RollNumber, r.Name };

foreach (var r in result2)

{

Console.WriteLine(r);

}

// Reteriving using SelectMany

var result3 = from r in GetStudents()

select r;

foreach (var r in

result3.SelectMany(Student => Student.Subject))

{

Console.WriteLine(r);

}

// directly applying  SelectMany

var result = GetStudents().AsQueryable().SelectMany(Subject => Subject.Subject);

foreach (var r in result)

{

Console.WriteLine(r);

}

Console.Read();

}

static List<Student> GetStudents()

{

List<Student> students = new List<Student>{

new Student {

Name = "Dhananjay",

RollNumber ="1" ,

Subject= new List<string>{"Math","Phy"}},

new Student {

Name = "Scott",

RollNumber ="2" ,

Subject= new List<string>{"Che","Phy"}},

new Student {

Name = "John",

RollNumber ="3" ,

Subject= new List<string>{"Hindi","Phy"}}};

return students;

}

}

class Student

{

public string Name { get; set; }

public string RollNumber { get; set; }

public List<string> Subject { get; set; }

}

}


I hope this article was useful. Thanks for reading. Happy Coding

About these ads

4 thoughts on “Select and SelectMany: LINQ projection operator

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s