LINQ Basics (Where, Select, OrderBy, FirstOrDefault) Masterclass

โšก C# 12 & .NET 8 ๐ŸŸข Chapter 23 of 35 ๐Ÿ“‚ Phase 8: LINQ & Query Pipelines ๐Ÿ“… 2026 Edition
๐Ÿ“Œ Covered in this chapter: LINQ Overview ยท Query vs Method Syntax ยท Where Filtering ยท Select Projection ยท OrderBy Sorting ยท FirstOrDefault ยท Aggregates (Sum, Avg, Min, Max)

Welcome to Phase 8 (Chapter 23): C# LINQ Basics (Language Integrated Query) Masterclass! LINQ integrates query capabilities directly into the C# language syntax. In this lesson, we cover query syntax vs method syntax, filtering (Where), projection (Select), sorting (OrderBy, ThenBy), element operators (First, FirstOrDefault, Single), and aggregate operators (Count, Sum, Average, Min, Max, Any, All).

1Method Syntax vs Query Syntax
C# โ€” LINQ Method vs Query Syntax โ–ถ Run in Compiler
List<int> numbers = new() { 10, 15, 20, 25, 30 };

// 1. Method Syntax (Fluent API using Lambdas โ€” Recommended)
var evenDoubledMethod = numbers
    .Where(number => number % 2 == 0)
    .Select(number => number * 2);

Console.WriteLine("Method Syntax Result:");
foreach (int num in evenDoubledMethod) Console.WriteLine(num);

// 2. Query Syntax (SQL-like syntax)
var evenDoubledQuery = from number in numbers
                       where number % 2 == 0
                       select number * 2;
2LINQ Aggregates & Element Operators
C# โ€” LINQ Operators Example โ–ถ Run in Compiler
List<int> scores = new() { 85, 92, 78, 95, 60 };

Console.WriteLine($"Count: {scores.Count()}");
Console.WriteLine($"Sum: {scores.Sum()}");
Console.WriteLine($"Average: {scores.Average():F2}");
Console.WriteLine($"Max: {scores.Max()}, Min: {scores.Min()}");

bool hasTopScorer = scores.Any(s => s >= 90);
Console.WriteLine($"Has 90+ score: {hasTopScorer}");

int firstPass = scores.FirstOrDefault(s => s >= 80);
Console.WriteLine($"First score >= 80: {firstPass}");
3Technical FAQs

Q1: What is the difference between First() and FirstOrDefault()?

First() throws an InvalidOperationException if no matching element is found. FirstOrDefault() returns the type's default value (e.g., 0 or null) safely without throwing an exception.