Language Integrated Query (LINQ) is one of the most powerful features in C#. It allows you to query, transform, and filter data directly in your C# code using a consistent, expressive syntax.
In this guide, we’ll cover what LINQ is, why it’s useful, how to use it, and provide plenty of practical examples for working with collections, databases, and beyond.
What Is LINQ?
LINQ stands for Language Integrated Query. It brings SQL-like querying capabilities into C# and .NET languages, allowing you to work with in-memory collections, databases, XML, and more.
Example:
var numbers = new[] { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
You can write concise, readable queries over data — no matter where that data comes from.
Why Use LINQ?
✅ Unified querying: Whether you work with arrays, lists, databases, or XML, the syntax stays the same.
✅ Type safety: Compile-time checking helps avoid mistakes.
✅ Readable code: More expressive and concise compared to loops or manual filtering.
✅ Composable: You can chain multiple queries together smoothly.
LINQ Syntax Forms
There are two ways to write LINQ queries:
Query Syntax (SQL-like)
var result = from n in numbers
where n % 2 == 0
select n;
Method Syntax (Fluent)
var result = numbers.Where(n => n % 2 == 0);
Both are valid and can be mixed.
Common LINQ Operations
Filtering with Where
var adults = people.Where(p => p.Age >= 18);
Projection with Select
var names = people.Select(p => p.Name);
Ordering with OrderBy
var sorted = people.OrderBy(p => p.LastName);
Aggregation
var totalAge = people.Sum(p => p.Age);
var averageAge = people.Average(p => p.Age);
var count = people.Count();
Grouping
var grouped = people.GroupBy(p => p.City);
foreach (var group in grouped)
{
Console.WriteLine($"City: {group.Key}, Count: {group.Count()}");
}
LINQ with Collections
List<int> numbers = new() { 1, 2, 3, 4, 5, 6 };
var squaredEvens = numbers
.Where(n => n % 2 == 0)
.Select(n => n * n);
foreach (var num in squaredEvens)
{
Console.WriteLine(num);
}
LINQ with Entity Framework Core
var expensiveProducts = dbContext.Products
.Where(p => p.Price > 1000)
.OrderBy(p => p.Name)
.ToList();
Important
- LINQ-to-Entities queries are translated to SQL and run on the database.
- Always test performance and understand generated queries.
LINQ with Anonymous Types
var projected = people.Select(p => new { p.Name, p.Age });
You can project only the fields you need, which is efficient and reduces memory usage.
Combining Multiple Queries
var query = products
.Where(p => p.InStock)
.OrderByDescending(p => p.Rating)
.Take(10);
You can chain multiple operations for complex querying.
Best Practices
✅ Use method syntax for flexibility.
✅ Avoid materializing queries too early (use ToList() only when needed).
✅ Be aware of deferred execution: queries don’t run until you enumerate them.
✅ Watch out for performance when querying large datasets.
Summary
LINQ is a cornerstone of modern C# development, providing a consistent, expressive way to work with data. By mastering LINQ, you gain the ability to write cleaner, more maintainable, and efficient code for a wide range of data sources.