LINQ — Query & Method Syntax

লেসন ৯ / ৫০

LINQ কী?

LINQ (Language INtegrated Query) — collection, DB, XML — সবকিছুতে SQL-এর মতো query করার পদ্ধতি C#-এ।

Method Syntax ⭐ (Lambda)

using System.Linq;

var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// Filter
var evens = nums.Where(n => n % 2 == 0).ToList();    // [2,4,6,8,10]

// Project
var squares = nums.Select(n => n * n).ToList();

// Both
var evenSquares = nums.Where(n => n % 2 == 0)
                       .Select(n => n * n)
                       .ToList();

Query Syntax (SQL-like)

var result = from n in nums
             where n % 2 == 0
             select n * n;

Common Operators

// Filter
nums.Where(n => n > 5)
nums.First(n => n > 5)        // throw if none
nums.FirstOrDefault(n => n > 5)
nums.Single(...)               // exactly one
nums.SingleOrDefault(...)
nums.Last() / nums.LastOrDefault()

// Quantifier
nums.Any(n => n > 5)            // bool
nums.All(n => n > 0)
nums.Contains(5)

// Aggregate
nums.Count()
nums.Count(n => n > 5)
nums.Sum() / nums.Sum(n => n * 2)
nums.Average() / nums.Min() / nums.Max()

// Order
nums.OrderBy(n => n)
nums.OrderByDescending(n => n)
people.OrderBy(p => p.Age).ThenBy(p => p.Name)

// Project
nums.Select(n => n.ToString())
people.Select(p => new { p.Name, p.Age })   // anonymous

// Group
people.GroupBy(p => p.City)
      .Select(g => new { City = g.Key, Count = g.Count() })

// Distinct
nums.Distinct()

// Skip/Take (pagination)
nums.Skip(10).Take(5)

// Conversion
nums.ToList(), ToArray(), ToDictionary(p => p.Id)

Join

var orders = new[] {
    new { UserId = 1, Product = "Pen" },
    new { UserId = 2, Product = "Book" }
};
var users = new[] {
    new { Id = 1, Name = "Rahim" },
    new { Id = 2, Name = "Karim" }
};

var joined = from o in orders
             join u in users on o.UserId equals u.Id
             select new { u.Name, o.Product };

// Method syntax
var joined2 = orders.Join(users,
    o => o.UserId,
    u => u.Id,
    (o, u) => new { u.Name, o.Product });

Real Example

var topProducts = products
    .Where(p => p.Stock > 0)
    .OrderByDescending(p => p.Sales)
    .Take(10)
    .Select(p => new { p.Name, p.Price })
    .ToList();