Here you learn how to write Lambda expressions in C#, Lambda expressions are type of anonymous functions that contain sequence of operators, which are termed as expressions
Why Lambda?: Using Lambda expression we can write function body without writing a delegate function, Very useful while writing any anonymous methods
Here we create some sample data, a student object containing details of few students.
var studentsStream = new List<Student> { new Student { FullName = "Aruna", StreamId=1, Score = 10 }, new Student { FullName = "Janet", StreamId=2, Score = 9 }, new Student { FullName = "Ajay", StreamId=1, Score = 11 }, new Student { FullName = "Kunal", StreamId=2, Score = 13 }, new Student { FullName = "Chandra", StreamId=2, Score = 8 }, };
Example 1: from above student list we want to select only student names
c# Lambda expression select example.
// Way 1 : (Query syntax) var studentNames = from s in studentsStream select s.FullName;
//Way 2: Using Lambda Expression var _studentNames = studentsStream.Select<Student, string>(s => s.FullName);
//Way 3 var _studentNames1 = studentsStream.Select(s => s.FullName).ToArray();
Example 2: from above student list select students where score is more than 10
// Way 1 var studentList = from stu in studentsStream where stu.Score>10 select stu;
// Way 2: Using Lambda Expression var studentList1 = studentsStream.Where<Student>(stu => stu.Score> 10);
// Way 3 var studentList2 = studentsStream.Where(s => s.Score > 10).ToList<Student>();
Here is an example of how you can use group by multiple columns in linq lambda expression
// Way 1 var students = from s in studentsStream group s by new { s.StreamId, s.Score } into g orderby g.Key.StreamId select new { StreamId = g.Key.StreamId, Score = g.Key.Score, TotalCount = g.Count() };
// Way 2: Using Lambda Expression var students1 = studentsStream .GroupBy(s => new { s.Score, s.StreamId}) .OrderBy(g => g.Key.StreamId) .Select(g => new { StreamId = g.Key, TotalCount = g.Count() });
Here in below example you can see we have used order by to read different columns into a Ienumerable variable which is anonymous type
// Ienumerable variable var students1 = studentsStream .OrderBy(g => g.FullName) .Select(g => new { Name = g.FullName, Stream = g.StreamId, TotalScore = g.Score });
// Ienumerable anonymous type foreach (var s in students1) { Console.WriteLine(string.Format("{0}-{1}-{2}", s.Name,s.Stream, s.TotalScore)); }
We can also build lambda expressions dynamically using expression builder.
For example, if we want to select students from above collection object, where StreamId is less than or equal to 10.
var students = studentsStream.Where(stu => stu.StreamId <= 10) .ToList<Student>();
Now, we write the same above query, using query builder like example below.
To use expression builder you need to use namespace reference System.Linq.Expressions;
using System.Linq.Expressions; // We can build query like var parameter = Expression.Parameter(typeof(Student), "stu"); var member = Expression.Property(parameter, "StreamId"); //stu.StreamId var constant = Expression.Constant(10); var body = Expression.LessThanOrEqual(member, constant); //stu.StreamId <= 10 var finalExpression = Expression.Lambda<Func<Student, bool>>(body, parameter);
Personally, I don’t use expression builder, rather I prefer writing query with parameter values directly like above groupby, orderby examples.