![]()
Şimdi de Linq ile datalarımızı çekerken tabloları birleştirmek zorunda kaldığımız yada bir çok ilişkili tablodan istenen dataları çekeceğimiz zamanlar olacaktır. Böyle durumlarda Join işlemleri ile çözüm arayacağız. Aslında Join işlemi ilişkili birden fazla tabloyu çeşitli şartlar ile birbirine bağlayarak bir sonuç dönme işilemidir. Mesala A tablosundaki Fizik öğretmeni nin , B tablosundaki 60 ve üzerinde not alan öğrencilerinin getirilmesi gib.. Linq da İnner Join , Left Join , Cross Join ve Group Join ile işlemlerimizi yaparız.
Şu tabloda güzel bir görsel özet sunulmaktadır.

Sırasıyla bakalım.
İnner Join : İki ya da daha fazla tabloda ortak olan iki alandaki değerleri kontrol ederek tabloları birleştirir
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
List<Department> Department = new List<Department>() { new Department{DepId=1,DepName=“Software”}, new Department{DepId=2,DepName=“Finance”}, new Department{DepId=3,DepName=“Health”}, new Department{DepId=4,DepName=“E-Commerce”}, }; List<Employee> Employee = new List<Employee>() { new Employee { EmpId=1,Name = “Suresh Dasari”, DeptId=1 }, new Employee { EmpId=2,Name = “Rohini Alavala”, DeptId=1 }, new Employee { EmpId=3,Name = “Praveen Alavala”, DeptId=2 }, new Employee { EmpId=4,Name = “Sateesh Alavala”, DeptId =2}, new Employee { EmpId=5,Name = “Madhav Sai”,DeptId = 4} }; var result = from d in Department join e in Employee on d.DepId equals e.DeptId select new { EmployeeName = e.Name, DepartmentName = d.DepName }; foreach (var item in result) { Console.WriteLine(item.EmployeeName + “\t | “ + item.DepartmentName); } //Output //Suresh Dasari | Software //Rohini Alavala | Software //Praveen Alavala | Finance //Sateesh Alavala | Finance //Madhav Sai | E – Commerce } class Department { public int DepId { get; set; } public string DepName { get; set; } } class Employee { public int EmpId { get; set; } public string Name { get; set; } public int DeptId { get; set; } } |
Left Join : Birinci tablodaki tüm kayıtları ve kayıtları olan ve eşleşen diğer tablodaki kayıtları birleştirir.
Not: Bu Join, iki veri kaynağındaki satırları aynı olan bir alan değeri kullanarak birleştirip tek bir liste oluşturmak için kullanılır. Normalde bir veri kaynağındaki ortak alan üzerinden birleştirilemeyen (ortak alan değeri bulunmayan) satırlar dışarda kalır. Ancak DefaultIfEmpty metodu ile eşleme bulunamayan satırlar için varsayılan değer kullanılarak bu satırlarda listeye eklenebilir.
Aşağıdaki olmayan departmandaki kişiyi DefaultIfEmpty (Boş olanlar için varsayılan değeri kullan) yöntemi yardımıyla çıktı listesine dahil edilmiştir.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
List<Department> Department = new List<Department>() { new Department{DepId=1,DepName=“Software”}, new Department{DepId=2,DepName=“Finance”}, new Department{DepId=3,DepName=“Health”}, new Department{DepId=4,DepName=“E-Commerce”}, }; List<Employee> Employee = new List<Employee>() { new Employee { EmpId=1,Name = “Suresh Dasari”, DeptId=1 }, new Employee { EmpId=2,Name = “Rohini Alavala”, DeptId=1 }, new Employee { EmpId=3,Name = “Praveen Alavala”, DeptId=4 }, new Employee { EmpId=4,Name = “Sateesh Alavala”, DeptId =4}, new Employee { EmpId=5,Name = “Madhav Sai”,DeptId = 5} }; var result = from e in Employee join d in Department on e.DeptId equals d.DepId into empDept from ed in empDept.DefaultIfEmpty() select new { DepartmentName = ed == null ? “No Department” : ed.DepName, EmployeeName = e.Name }; foreach (var item in result) { Console.WriteLine(“{0} : Departmanındaki –> {1} “, item.DepartmentName, item.EmployeeName); } //Output //Software: Departmanındaki– > Suresh Dasari //Software : Departmanındaki– > Rohini Alavala //E – Commerce : Departmanındaki– > Praveen Alavala //E – Commerce : Departmanındaki– > Sateesh Alavala //No Department: Departmanındaki– > Madhav Sai } class Department { public int DepId { get; set; } public string DepName { get; set; } } class Employee { public int EmpId { get; set; } public string Name { get; set; } public int DeptId { get; set; } } |
Yukarda into dan sonra empDept değişken adı ve from sonra ed de empDept nin bir elemanı gibi alınır ve eğer boşka default(varsayılan) değer ata denir ve empDept burada sol taraftaki tabloyu temsil ediyor.
Cross Join : Çapraz birleşim olan cross join, ilk tablodaki her satırı ikinci tablodaki her satırla birleştirir. Yani iki tablodaki satırları aynı olan bir alan değeri kullanarak birleştirip tek bir liste oluşturmak için kullanılır.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
List<Department> Department = new List<Department>() { new Department{DepId=1,DepName=“Software”}, new Department{DepId=2,DepName=“Finance”}, new Department{DepId=3,DepName=“Health”}, new Department{DepId=4,DepName=“E-Commerce”}, }; List<Employee> Employee = new List<Employee>() { new Employee { EmpId=1,Name = “Suresh Dasari”, DeptId=1 }, new Employee { EmpId=2,Name = “Rohini Alavala”, DeptId=1 }, new Employee { EmpId=3,Name = “Praveen Alavala”, DeptId=4 }, new Employee { EmpId=4,Name = “Sateesh Alavala”, DeptId =4}, new Employee { EmpId=5,Name = “Madhav Sai”,DeptId = 5} }; var result = from e in Employee from d in Department select new { EmployeeName = e.Name, DepartmentName = d.DepName }; foreach (var item in result) { Console.WriteLine(“{0} : Departmanındaki –> {1} “, item.DepartmentName, item.EmployeeName); } //Output //Software: Departmanındaki– > Suresh Dasari //Finance : Departmanındaki– > Suresh Dasari //Health : Departmanındaki– > Suresh Dasari //E – Commerce : Departmanındaki– > Suresh Dasari //Software : Departmanındaki– > Rohini Alavala //Finance : Departmanındaki– > Rohini Alavala //Health : Departmanındaki– > Rohini Alavala //E – Commerce : Departmanındaki– > Rohini Alavala //Software : Departmanındaki– > Praveen Alavala //Finance : Departmanındaki– > Praveen Alavala //Health : Departmanındaki– > Praveen Alavala //E – Commerce : Departmanındaki– > Praveen Alavala //Software : Departmanındaki– > Sateesh Alavala //Finance : Departmanındaki– > Sateesh Alavala //Health : Departmanındaki– > Sateesh Alavala //E – Commerce : Departmanındaki– > Sateesh Alavala //Software : Departmanındaki– > Madhav Sai //Finance : Departmanındaki– > Madhav Sai //Health : Departmanındaki– > Madhav Sai //E – Commerce : Departmanındaki– > Madhav Sai } class Department { public int DepId { get; set; } public string DepName { get; set; } } class Employee { public int EmpId { get; set; } public string Name { get; set; } public int DeptId { get; set; } } |
Group Join : Her bir kayıt için ilişkili verileri bir liste şeklinde döner. Yani iki tablodaki satırları aynı olan bir alan değeri kullanarak birleştirip tek bir liste oluşturmak için kullanılır.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
List<Department> Department = new List<Department>() { new Department{DepId=1,DepName=“Software”}, new Department{DepId=2,DepName=“Finance”}, new Department{DepId=3,DepName=“Health”}, new Department{DepId=4,DepName=“E-Commerce”}, }; List<Employee> Employee = new List<Employee>() { new Employee { EmpId=1,Name = “Suresh Dasari”, DeptId=1 }, new Employee { EmpId=2,Name = “Rohini Alavala”, DeptId=1 }, new Employee { EmpId=3,Name = “Praveen Alavala”, DeptId=4 }, new Employee { EmpId=4,Name = “Sateesh Alavala”, DeptId =4}, new Employee { EmpId=5,Name = “Madhav Sai”,DeptId = 5} }; var result = from d in Department join e in Employee on d.DepId equals e.DeptId into empDept select new { DepartmentName = d.DepName, Employees = from emp2 in empDept orderby emp2.Name select emp2 }; int totalItems = 0; foreach (var empGroup in result) { Console.WriteLine(empGroup.DepartmentName); foreach (var item in empGroup.Employees) { totalItems++; Console.WriteLine(“–> {0}”, item.Name); } } //Output //Software //– > Rohini Alavala //– > Suresh Dasari //Finance //Health //E – Commerce //– > Praveen Alavala //– > Sateesh Alavala } class Department { public int DepId { get; set; } public string DepName { get; set; } } class Employee { public int EmpId { get; set; } public string Name { get; set; } public int DeptId { get; set; } } |
sağlıcakla kalın….








Bir yanıt yazın