Understanding let, where, orderby, and select in C#

Mastering LINQ’s Core Query Keywords

LINQ (Language Integrated Query) is one of C#’s most powerful features for working with data collections.
It brings SQL-like syntax right into your code, allowing you to query, transform, and filter data using clean, expressive statements.

In this tutorial, we’ll explore four key LINQ query operatorslet, where, orderby, and select and how they work together to make data manipulation both elegant and efficient.


🔹 The Building Blocks of a LINQ Query

A typical LINQ query looks like this:

var results = from item in collection
              where item.Price > 50
              orderby item.Name
              select item.Name;

Each keyword has a specific role:

KeywordPurpose
letCreates a temporary variable within a query
whereFilters data based on a condition
orderbySorts the result set
selectDefines the output or projection

🔹 let – Create Variables Inside Your Query

The let keyword allows you to store the result of a calculation or expression in a new variable that you can reuse later in the same query.
It’s especially useful when working with derived values or when you want to simplify complex conditions.

Example:

var results = from num in Enumerable.Range(1, 10)
              let square = num * num
              where square > 20
              select new { Number = num, Square = square };

Output:

Number = 5, Square = 25
Number = 6, Square = 36
...
Number = 10, Square = 100

Best for:

  • Simplifying expressions
  • Improving readability
  • Avoiding repeated calculations

🔧 Tip: Use let to make queries more expressive — not to hold large temporary data unnecessarily.


🔹 where – Filter the Data

The where clause filters a sequence to only include elements that satisfy a condition.
It works similarly to the WHERE keyword in SQL.

Example:

var numbers = new[] { 10, 25, 40, 55, 70 };

var result = from n in numbers
             where n > 30 && n < 60
             select n;

Output:

40, 55

Best for:

  • Filtering based on numeric, string, or object conditions
  • Combining multiple logical expressions

🔧 Key Rules:

  • Returns elements that evaluate to true for the condition
  • Can be chained multiple times for layered filtering

🔹 orderby – Sort the Results

The orderby clause sorts the query output in ascending order by default, but you can specify descending using the descending keyword.

Example:

var fruits = new[] { "Banana", "Apple", "Cherry", "Mango" };

var sorted = from f in fruits
             orderby f
             select f;

Output:

Apple, Banana, Cherry, Mango

Now let’s sort descending:

var sortedDesc = from f in fruits
                 orderby f descending
                 select f;

Output:

Mango, Cherry, Banana, Apple

Best for:

  • Alphabetical sorting
  • Sorting by numeric or date values

🔧 Advanced Tip: You can order by multiple keys:

orderby student.Grade descending, student.Name ascending

🔹 select – Choose What to Return

The select keyword defines what your query returns.
It can project entire objects, specific fields, or even anonymous types.

Example 1 – Selecting entire objects

var result = from s in students
             select s;

Example 2 – Selecting specific properties

var names = from s in students
            select s.Name;

Example 3 – Creating a new anonymous type

var summary = from s in students
              select new { s.Name, s.Age };

Best for:

  • Shaping your data output
  • Returning only what’s needed
  • Creating custom projections on the fly

🔧 Tip: Always select only what you need — it improves readability and performance.


🧩 Combined Example – Using All Four Together

var students = new[]
{
    new { Name = "Alice", Score = 85 },
    new { Name = "Bob", Score = 67 },
    new { Name = "Charlie", Score = 90 },
    new { Name = "Diana", Score = 72 }
};

var topStudents =
    from s in students
    let grade = s.Score >= 80 ? "A" : "B"
    where s.Score > 70
    orderby s.Score descending
    select new { s.Name, s.Score, Grade = grade };

Output:

Name: Charlie, Score: 90, Grade: A
Name: Alice, Score: 85, Grade: A
Name: Diana, Score: 72, Grade: B

What’s Happening:

  • let creates a grade label based on the score
  • where filters out low scores
  • orderby sorts highest to lowest
  • select shapes the final output

📚 Summary

KeywordDescriptionExample
letCreates a temporary variablelet total = price * qty
whereFilters based on conditionwhere age > 18
orderbySorts ascending or descendingorderby name descending
selectDefines the shape of the outputselect new { Name, Age }

✅ Best Practices

  • Use let to clarify logic, not complicate it
  • Keep where clauses simple and readable
  • Always specify descending when needed for clarity
  • Use select to project only necessary data
  • Combine these operators for elegant, SQL-like queries

🧪 Challenge Task

Write a LINQ query to process a list of products:

  • Use let to calculate discounted price
  • Use where to filter items under £50
  • Use orderby to sort cheapest first
  • Use select to return { Name, DiscountedPrice }

Example:

var products = new[]
{
    new { Name = "Shoes", Price = 60 },
    new { Name = "Hat", Price = 30 },
    new { Name = "Coat", Price = 90 },
    new { Name = "Scarf", Price = 20 }
};

👨‍💻 Want More?

Contact James to learn the depths of LINQ:

  • let, where, orderby, and select
  • Grouping and joining data
  • Lambda expressions and query syntax
  • Real-world data manipulation projects

Master LINQ and make your C# data queries cleaner, faster, and smarter.