LINQ (Language Integrated Query) is one of C#’s most powerful features, allowing developers to query and transform data using a clean, readable syntax. Whether you're working with in-memory collections like List<T>
or querying a database using Entity Framework Core, LINQ offers a unified approach to accessing and shaping your data.
In this guide, we’ll walk through every commonly used LINQ method, grouped by purpose, and explain when and why to use them—with examples and real-world insights.
🔍 1. Element Operators
These methods are used to retrieve single items from a collection.
Method | When to Use |
---|---|
First() |
When you're certain the collection has at least one match. |
FirstOrDefault() |
When the match might not exist and you want to avoid exceptions. |
FirstOrDefaultAsync() |
Async version for EF Core; avoids blocking the main thread. |
Single() |
When you expect exactly one matching item. Throws if more than one. |
SingleOrDefault() |
When there may be zero or one match, and duplicates are not allowed. |
Last() |
When you need the last item in a collection. |
LastOrDefault() |
Safe alternative to Last() . |
ElementAt(index) |
When accessing a specific index. |
ElementAtOrDefault() |
Safe alternative that returns default if index is out of bounds. |
Example:
var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);
✅ 2. Filtering Operators
Filter elements that meet certain conditions.
Method | When to Use |
---|---|
Where() |
To filter multiple elements by a condition. |
OfType<T>() |
To filter by type in non-generic collections. |
Example:
var activeUsers = users.Where(u => u.IsActive).ToList();
🔢 3. Projection Operators
Used to transform data from one shape to another.
Method | When to Use |
---|---|
Select() |
To map each item into a new form or DTO. |
SelectMany() |
To flatten nested collections into a single collection. |
var userNames = users.Select(u => u.Name).ToList();
🔁 4. Sorting Operators
For ordering data.
Method | When to Use |
---|---|
OrderBy() |
To sort in ascending order. |
OrderByDescending() |
To sort in descending order. |
ThenBy() |
For secondary ascending sort. |
ThenByDescending() |
For secondary descending sort. |
Reverse() |
To reverse the current order. |
Example:
var sorted = users.OrderBy(u => u.Name).ThenBy(u => u.CreatedAt);
❓ 5. Quantifier Methods
Return true or false based on conditions.
Method | When to Use |
---|---|
Any() |
To check if any items exist or match a condition. |
AnyAsync() |
Async version for EF Core. |
All() |
To check if all items match a condition. |
Contains() |
To check if a specific value exists in the collection. |
Example:
bool exists = await _context.Users.AnyAsync(u => u.Email == email);
🧮 6. Aggregation Methods
Used to perform summary calculations.
Method | When to Use |
---|---|
Count() |
To count items in a collection. |
Sum() |
To calculate a total. |
Average() |
To calculate the average of numeric values. |
Min() / Max()
|
To get the smallest/largest value. |
Aggregate() |
To create custom aggregations (e.g., string joins). |
Example:
var totalSales = orders.Sum(o => o.TotalAmount);
🧱 7. Grouping Methods
Group data based on a key.
Method | When to Use |
---|---|
GroupBy() |
To group elements by a common key or value. |
Example:
var grouped = orders.GroupBy(o => o.CustomerId);
➕ 8. Set Operators
Used to perform set-based logic like union or intersection.
Method | When to Use |
---|---|
Distinct() |
To remove duplicate items. |
Union() |
Combines two sets, removes duplicates. |
Intersect() |
Returns common items from both collections. |
Except() |
Returns items from one set not found in the other. |
Example:
var uniqueEmails = users.Select(u => u.Email).Distinct();
🔗 9. Joining Operators
Combine elements from multiple collections.
Method | When to Use |
---|---|
Join() |
To join two collections based on a key (similar to SQL INNER JOIN). |
GroupJoin() |
To join and group elements (similar to LEFT JOIN). |
Zip() |
To combine two collections element-by-element. |
Example:
var userRoles = users.Join(roles,
user => user.RoleId,
role => role.Id,
(user, role) => new { user.Name, role.Name });
🛠️ 10. Generation Methods
Used to create data sequences.
Method | When to Use |
---|---|
Range() |
To generate a sequence of numbers. |
Repeat() |
To repeat a value multiple times. |
Empty<T>() |
To return an empty collection of type T . |
Example:
var numbers = Enumerable.Range(1, 10);
🔄 11. Conversion Methods
Transform query results into a specific type.
Method | When to Use |
---|---|
ToList() |
Convert to a List<T> . |
ToArray() |
Convert to an array. |
ToDictionary() |
Convert to a dictionary. |
AsEnumerable() |
Switch to LINQ to Objects from LINQ to SQL. |
AsQueryable() |
Enable further querying (esp. in LINQ to SQL). |
Example:
var userList = users.Where(u => u.IsActive).ToList();
💡 Real-World Use Cases
Scenario | Recommended LINQ Method(s) |
---|---|
Retrieve user by ID |
FirstOrDefault() , SingleOrDefault()
|
Check if an email exists |
Any() / AnyAsync()
|
Get first five recent orders | OrderByDescending().Take(5) |
Join users with roles | Join() |
Sum total sales | Sum() |
Group products by category | GroupBy() |
Convert results to list or array |
ToList() , ToArray()
|
🧠 Best Practices & Pitfalls to Avoid
✅ Prefer FirstOrDefault() over First() to avoid exceptions.
✅ Use Any() instead of Count() > 0 for better performance.
✅ Avoid calling ToList() early in the query chain.
⚠️ Be cautious with SelectMany(), it flattens data, which can be confusing.
⚠️ Single() is strict—use only when you're confident about unique matches.
LinkedIn Account
: LinkedIn
Twitter Account
: Twitter
Credit: Graphics sourced from pawelmajewski'S Blog
Top comments (0)