LINQ Sorguları
LINQ Nedir?
Language Integrated Query (LINQ), .NET'te veri sorgulama için birleşik bir sözdizimi sağlar.
LINQ Sorgu Çeşitleri
1. Query Syntax (Sorgu Sözdizimi)
var result = from student in students
where student.Age > 20
select student.Name;
2. Method Syntax (Metot Sözdizimi)
var result = students
.Where(s => s.Age > 20)
.Select(s => s.Name);
LINQ Operatörleri
Filtreleme Operatörleri
Where
var adults = students.Where(s => s.Age >= 18);
OfType
var strings = objects.OfType<string>();
Distinct
var uniqueAges = students.Select(s => s.Age).Distinct();
Projeksiyon Operatörleri
Select
var names = students.Select(s => s.Name);
// Anonim tip
var studentInfo = students.Select(s => new { s.Name, s.Age });
SelectMany
var allCourses = students.SelectMany(s => s.Courses);
Sıralama Operatörleri
OrderBy
var sorted = students.OrderBy(s => s.Age);
OrderByDescending
var sorted = students.OrderByDescending(s => s.Age);
ThenBy
var sorted = students
.OrderBy(s => s.Department)
.ThenBy(s => s.Name);
Gruplama Operatörleri
GroupBy
var grouped = students.GroupBy(s => s.Department);
foreach (var group in grouped)
{
Console.WriteLine($"Department: {group.Key}");
foreach (var student in group)
{
Console.WriteLine(student.Name);
}
}
Birleştirme Operatörleri
Join
var result = from student in students
join course in courses on student.CourseId equals course.Id
select new { student.Name, course.Title };
// Method Syntax
var result = students.Join(
courses,
s => s.CourseId,
c => c.Id,
(s, c) => new { s.Name, c.Title }
);
GroupJoin
var result = from department in departments
join student in students on department.Id equals student.DepartmentId into studentGroup
select new { department.Name, Students = studentGroup };
Küme Operatörleri
Union
var combined = list1.Union(list2);
Intersect
var common = list1.Intersect(list2);
Except
var difference = list1.Except(list2);
Toplama Operatörleri
Count
int count = students.Count();
int adultCount = students.Count(s => s.Age >= 18);
Sum
int totalAge = students.Sum(s => s.Age);
Average
double avgAge = students.Average(s => s.Age);
Min / Max
int minAge = students.Min(s => s.Age);
int maxAge = students.Max(s => s.Age);
Aggregate
string names = students.Aggregate("", (acc, s) => acc + s.Name + ", ");
Sayfalama Operatörleri
Skip
var skipped = students.Skip(10);
Take
var first10 = students.Take(10);
SkipWhile / TakeWhile
var result = students.SkipWhile(s => s.Age < 20);
var result = students.TakeWhile(s => s.Age < 25);
Kontrol Operatörleri
Any
bool hasAdults = students.Any(s => s.Age >= 18);
All
bool allAdults = students.All(s => s.Age >= 18);
Contains
bool contains = students.Contains(student);
Element Operatörleri
First / FirstOrDefault
var first = students.First();
var first = students.FirstOrDefault();
var first = students.First(s => s.Age > 20);
Last / LastOrDefault
var last = students.Last();
var last = students.LastOrDefault();
Single / SingleOrDefault
var single = students.Single(s => s.Id == 1);
var single = students.SingleOrDefault(s => s.Id == 1);
ElementAt
var element = students.ElementAt(5);
LINQ Lambda Kullanımı
Temel Lambda Sözdizimi
// (parametreler) => ifade
(x) => x * 2
(x, y) => x + y
() => DateTime.Now
Örnekler
Basit Filtreleme
var adults = students.Where(s => s.Age >= 18);
Karmaşık Koşullar
var result = students.Where(s =>
s.Age >= 18 &&
s.Department == "Engineering" &&
s.GPA > 3.0
);
Null Kontrolleri
var result = students.Where(s => s.Address != null && s.Address.City == "Istanbul");
String Operasyonları
var result = students.Where(s => s.Name.StartsWith("A"));
var result = students.Where(s => s.Email.Contains("@gmail.com"));
Sayısal Operasyonlar
var result = students.Where(s => s.GPA > 3.5 && s.GPA <= 4.0);
Tarih Operasyonları
var result = students.Where(s => s.EnrollmentDate.Year == 2023);
Lambda ile Select
// Tek özellik
var names = students.Select(s => s.Name);
// Anonim tip
var info = students.Select(s => new { s.Name, s.Age });
// Hesaplanmış değer
var ages = students.Select(s => DateTime.Now.Year - s.BirthYear);
Lambda ile GroupBy
var grouped = students.GroupBy(s => s.Department);
var grouped = students
.GroupBy(s => s.Department)
.Select(g => new
{
Department = g.Key,
Count = g.Count(),
AvgAge = g.Average(s => s.Age)
});
Lambda ile OrderBy
var sorted = students.OrderBy(s => s.Age).ThenBy(s => s.Name);
Deferred Execution (Ertelenmiş Yürütme)
var query = students.Where(s => s.Age > 20); // Henüz çalışmaz
var result = query.ToList(); // Burada çalışır
Immediate Execution
var result = students.Where(s => s.Age > 20).ToList(); // Hemen çalışır
LINQ to SQL vs LINQ to Objects
// LINQ to Objects (Bellek içi)
var students = new List<Student>();
var result = students.Where(s => s.Age > 20).ToList();
// LINQ to SQL (Veritabanı)
var result = dbContext.Students.Where(s => s.Age > 20).ToList();
