LINQ: The Basics and Core Concepts

Before LINQ, data handling in C# was often more verbose and complex, especially when dealing with collections, databases, and XML. Without LINQ, developers had to rely heavily on loops, conditionals, and helper classes to filter, sort, and transform data.

Example if you need to filter or transform data in a collection, you would often use foreach loops combined with conditional statements.

C#
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
List<int> evenNumbers = new List<int>();

foreach (int number in numbers)
{
    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}

With LINQ it makes the above code more concise and readable.

C#
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

So the most important questions to answer is what is LINQ? LINQ, short for Language Integrated Query, is a feature in .NET that provides a concise way to work with data. LINQ brings SQL-like query capabilities into C#, allowing you to write queries directly in your code. It consists of several namespaces, with System.Linq being the most commonly used.

Why Use LINQ?

LINQ simplifies data manipulation by allowing you to:

  • Query data directly within your C# code.
  • Write type-safe and expressive queries
  • Support multiple data sources consistently (like collections, databases, XML).
  • Reduce boilerplate code.

Core LINQ Concepts

Now let’s breakdown the core LINQ concepts:

1. LINQ Query Syntax vs. Method Syntax: LINQ can be written using query syntax or method syntax.

  • Query Syntax: SQL-like syntax, intuitive if you’re familiar with SQL
C#
var result = from item in collection
             where item.Condition
             select item;
  • Method Syntax: Uses extension methods, preferred for its flexibility
C#
var result = collection.Where(item => item.Condition);

2. LINQ Operators: LINQ provides a range of operators, each tailored for specific data operations. Some commonly used ones include:

  • Where: Filters data based on a condition.
  • Select: Projects each item into a new form.
  • OrderBy / OrderByDescending: Sorts the data.
  • GroupBy: Groups items based on a key.
  • Aggregate: Performs operations to produce a single result.

3. Deferred Execution

LINQ queries are deferred, meaning they don’t execute immediately when defined. Instead, they execute only when you iterate over them (e.g., using foreach or .ToList()), allowing for efficient data processing.

4. Anonymous Types and Projections

LINQ lets you create anonymous types on the fly, making it easy to project data into new shapes without defining separate classes.

C#
var result = collection.Select(item => new { item.Property1, item.Property2 });

5. Lambda Expressions

Lambda expressions are fundamental in LINQ. They allow you to define inline functions that can be passed to LINQ methods.

C#
var result = collection.Where(x => x.Property > 10);

Basic Examples

Here are a few examples of how LINQ can be used in C#:

1. Filtering Data with Where

C#
var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

This code filters out all even numbers from the list.

2. Selecting and Projecting Data with Select

C#
var people = new List<Person> {
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Bob", Age = 40 }
};
var names = people.Select(p => p.Name).ToList();

Here, we’re projecting the Name property from each Person into a list of names.

3. Ordering Data with OrderBy and OrderByDescending

C#
var sortedPeople = people.OrderBy(p => p.Age).ToList();

4. Grouping Data with GroupBy

C#
var groupedByAge = people.GroupBy(p => p.Age);
foreach (var group in groupedByAge)
{
    Console.WriteLine($"Age: {group.Key}");
    foreach (var person in group)
    {
        Console.WriteLine(person.Name);
    }
}

This groups people by age, allowing you to process each group separately.

Mastering LINQ is a significant step toward writing efficient and expressive code in .NET. Whether you’re working with in-memory collections, databases, or XML, LINQ provides a unified approach to data manipulation. Start experimenting with LINQ operators, and you’ll quickly see how it can simplify your code.

Assi Arai
Assi Arai
Articles: 31