✅ LINQ in C# – Complete In-Depth Guide
with Examples
LINQ is one of the most powerful features of C# that every .NET developer must learn. In this tutorial, you will understand LINQ from basics to advanced with arrays, collections, ASP.NET Core MVC examples, and Join operations.
🔷 What is LINQ?
LINQ (Language Integrated Query) is a .NET feature that allows you to query data directly inside C# code using SQL-like or method-chaining syntax.
LINQ can be used to query:
- ✅ Arrays
- ✅ Collections (List, Dictionary, etc.)
- ✅ Databases (Entity Framework)
- ✅ XML
- ✅ JSON
🔷 Types of LINQ Syntax
- Query Syntax (SQL-like)
- Method Syntax (Fluent / Chaining)
- Mixed Syntax (Less Common)
✅ Why LINQ?
❌ Without LINQ
foreach (var item in list)
{
if (item > 10)
result.Add(item);
}
✅ With LINQ
var result = list.Where(x => x > 10);
- ✅ Clean Code
- ✅ Less Lines of Code
- ✅ Readable
- ✅ Powerful
🔹 LINQ Basics
✅ Import Namespace
using System.Linq;
🔹 LINQ Syntax Examples
1️⃣ Query Syntax (SQL-like)
var result = from n in numbers
where n > 5
select n;
2️⃣ Method Syntax (Recommended)
var result = numbers.Where(n => n > 5);
✅ Method syntax is preferred in real-world projects
🔹 LINQ with Arrays
Example 1: Filter Even Numbers
int[] numbers = { 1, 2, 3, 4, 5, 6, 7 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var n in evenNumbers)
{
Console.WriteLine(n);
}
Output: 2, 4, 6
Example 2: Select / Projection
var squares = numbers.Select(n => n * n);
Example 3: Order By
var sortedDesc = numbers.OrderByDescending(n => n);
Example 4: Aggregation Functions
numbers.Sum(); numbers.Max(); numbers.Min(); numbers.Average(); numbers.Count();
🔹 LINQ with Collections (List<T>)
Employee Model
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public int Salary { get; set; }
}
Sample Data
List<Employee> employees = new List<Employee>
{
new Employee { Id=1, Name="Amit", Department="IT", Salary=40000 },
new Employee { Id=2, Name="Neha", Department="HR", Salary=30000 },
new Employee { Id=3, Name="Rahul", Department="IT", Salary=50000 },
new Employee { Id=4, Name="Pooja", Department="Finance", Salary=45000 }
};
Example: Where (Filter)
var itEmployees = employees.Where(e => e.Department == "IT");
Output: Amit, Rahul
OrderBy + ThenBy
var sortedEmployees = employees
.OrderBy(e => e.Department)
.ThenByDescending(e => e.Salary);
🔹 Advanced LINQ Operators
First / FirstOrDefault
employees.First(e => e.Department == "HR"); employees.FirstOrDefault(e => e.Department == "Admin");
Single / SingleOrDefault
employees.Single(e => e.Id == 1);
Any / All
employees.Any(e => e.Salary > 60000); employees.All(e => e.Department == "IT");
🔹 GroupBy Example
var groupByDept = employees.GroupBy(e => e.Department);
var groupByDept = employees
.GroupBy(e => e.Department)
.Select(g => new
{
Department = g.Key,
TotalEmployees = g.Count()
});
🔷 LINQ Join Example
Query Syntax
var result = from s in students
join c in courses
on s.CourseId equals c.Id
select new
{
StudentName = s.Name,
CourseName = c.CourseName,
Marks = s.Marks
};
Method Syntax
var result = students.Join(courses,
s => s.CourseId,
c => c.Id,
(s, c) => new
{
StudentName = s.Name,
CourseName = c.CourseName,
Marks = s.Marks
});
🔍 1. Filtering (Where)
👉 Get employees with salary > 50,000
var highSalary = employees.Where(e => e.Salary > 50000);
foreach (var emp in highSalary)
{
Console.WriteLine(emp.Name);
}
🔍 2. Sorting (OrderBy / OrderByDescending)
var sorted = employees.OrderByDescending(e => e.Salary);
foreach (var emp in sorted)
{
Console.WriteLine(emp.Name + " - " + emp.Salary);
}
foreach (var emp in sorted)
{
Console.WriteLine(emp.Name + " - " + emp.Salary);
}
🔍 3. Selecting Specific Fields (Select)
var names = employees.Select(e => e.Name);
foreach (var name in names)
{
Console.WriteLine(name);
}
foreach (var name in names)
{
Console.WriteLine(name);
}
🔍 4. GroupBy + Count (Important ⭐)
👉 Count employees in each department
var groupByDept = employees
.GroupBy(e => e.Department)
.Select(g => new
{
Department = g.Key,
Count = g.Count(),
AvgSalary = g.Average(e => e.Salary)
});
foreach (var item in groupByDept)
{
Console.WriteLine($"{item.Department} - Count: {item.Count}, AvgSalary: {item.AvgSalary}");
}
🔍 5. First / FirstOrDefault
var firstIT = employees.FirstOrDefault(e => e.Department == "IT");
Console.WriteLine(firstIT?.Name);
Console.WriteLine(firstIT?.Name);
🔍 6. Any / All
bool hasHighSalary = employees.Any(e => e.Salary > 70000);
bool allAbove20 = employees.All(e => e.Age > 20);
Console.WriteLine(hasHighSalary);
Console.WriteLine(allAbove20);
bool allAbove20 = employees.All(e => e.Age > 20);
Console.WriteLine(hasHighSalary);
Console.WriteLine(allAbove20);
🔍 7. Max / Min / Sum / Average
int maxSalary = employees.Max(e => e.Salary);
int totalSalary = employees.Sum(e => e.Salary);
double avgSalary = employees.Average(e => e.Salary);
Console.WriteLine(maxSalary);
Console.WriteLine(totalSalary);
Console.WriteLine(avgSalary);
int totalSalary = employees.Sum(e => e.Salary);
double avgSalary = employees.Average(e => e.Salary);
Console.WriteLine(maxSalary);
Console.WriteLine(totalSalary);
Console.WriteLine(avgSalary);
🔍 8. Query Syntax (SQL Style)
👉 Same GroupBy using query syntax
var result = from e in employees
group e by e.Department into g
select new
{
Department = g.Key,
Count = g.Count()
};
foreach (var item in result)
{
Console.WriteLine(item.Department + " - " + item.Count);
}
🔍 9. Multiple Conditions
var filtered = employees
.Where(e => e.Department == "IT" && e.Salary > 60000);
foreach (var emp in filtered)
{
Console.WriteLine(emp.Name);
}
.Where(e => e.Department == "IT" && e.Salary > 60000);
foreach (var emp in filtered)
{
Console.WriteLine(emp.Name);
}
🔥 10. Real Interview Scenario (Advanced)
👉 Highest paid employee in each department
var secondMaxSalary = employeesvar highestSalaryByDept = employees
.GroupBy(e => e.Department)
.Select(g => g.OrderByDescending(e => e.Salary).First());
foreach (var emp in highestSalaryByDept)
{
Console.WriteLine($"{emp.Department} - {emp.Name} - {emp.Salary}");
}Second Highest Salary
.Select(e => e.Salary)
.Distinct()
.OrderByDescending(s => s)
.Skip(1)
.FirstOrDefault();
Console.WriteLine(secondMaxSalary);
🚀 Summary (Important Concepts)
-
Where → filter
-
Select → projection
-
GroupBy → grouping
-
OrderBy → sorting
-
Count / Sum / Avg → aggregation
-
First / Any / All → condition checking
Where → filter
Select → projection
GroupBy → grouping
OrderBy → sorting
Count / Sum / Avg → aggregation
First / Any / All → condition checking
| Method | If 1 match | If multiple matches | If no match |
|---|---|---|---|
| First | ✅ returns first | ✅ returns first | ❌ Exception |
| FirstOrDefault | ✅ returns first | ✅ returns first | ✅ null/default |
| Single | ✅ returns element | ❌ Exception | ❌ Exception |
| SingleOrDefault | ✅ returns element | ❌ Exception | ✅ null/default |

0 Comments
POST Answer of Questions and ASK to Doubt