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

Dhananjay Kumar is Developer, Blogger , Speaker, Learner , Mindcracker & Microsoft MVP.

Tagged with: , ,
Posted in LINQ
4 comments on “Select and SelectMany: LINQ projection operator
  1. Dhananjay Kumar says:

    Glad you like it

  2. Tahir says:

    Nice article .well done.

  3. Sanjay says:

    Awesome Sir

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 )

Connecting to %s

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Categories
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my current or previous employer's view in anyway. © Copyright 2013
Follow

Get every new post delivered to your Inbox.

Join 2,120 other followers

%d bloggers like this: