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();