8. Join Queries (Birleştirme Sorguları)

Birleştirme Sorguları

1. Join metodu

Entityframe work ile aynı sqlde olduğu gibi belli veri gruplarını ilişkilendirebiliriz. Yapı şu şekildedir; elimizdeki liste üzerinden join extension metodunu çağırırız. Bu join extension metodu 4 adet parametre alır.
Bunlar , ilk listenin birleştirileceği ikinci veri listesi, ilk ana listenin ilişkilendirilecek verisi (genelde id), ikinci veri setinin ilk veri setiyle ilişkilendirilecek id’si (foreing key) ve bu ilişki sonucunda yaratılmasını istediğimiz veri yapısı.

Aşağıda myList isimli veri setimizi myList2 isimli veri setimizle ilişkilendirdik. myList isimli ana veri setimizin ikinci veri seti ile Id propertysi, ikinci veri setinin de ana verisetle ForeignId propertysi ilişkilendireceğini söyledik ve sonucunda new { Name = x.Name, Surname = x.Surname,City=y.City } şeklinde verilerden oluşan bir liste oluşmasını söyledik ki buradaki veri tipini istediğiniz şekilde ayarlayabilirsiniz.

var result  =  myList.Join( myList2, x => x.Id, y => y.ForeignId, (x, y) => new { Name = x.Name, Surname = x.Surname,City=y.City }).ToList();

Sorgunun içerisinde kullanilan liste ve veri tipleri için aşağıdaki kodları inceleyebilirsiniz.

List<MyObject> myList = new List<MyObject>
{
  new MyObject{Id=1,Name = "cagatay",Surname = "kiziltan"},
  new MyObject{Id=2,Name = "kuthay",Surname = "gümüş"},
  new MyObject{Id=3,Name = "ömer",Surname = "korkmaz"}

};

List<MyInnerObject> myList2 = new List<MyInnerObject>{
    new MyInnerObject {ForeignId = 1, City = "istanbul"},
    new MyInnerObject { ForeignId = 1, City = "izmir" },
    new MyInnerObject { ForeignId = 2, City = "Antalya" },
    new MyInnerObject { ForeignId = 2, City = "Kocaeli" },
    new MyInnerObject { ForeignId = 2, City = "Sakarya" },
    new MyInnerObject { ForeignId = 3, City = "Manisa" },
    new MyInnerObject { ForeignId = 3, City = "Igdir" }
 };

public class MyObject
{
  [Key]
  public int Id { get; set; }

  public string Name { get; set; }

  public string Surname { get; set; }

}

public class MyInnerObject
{
  public int ForeignId { get; set; }

  public string City { get; set; }
}

2. GroupJoin metodu

GroupJoin metodu ile join metodu arasında ince bir fark vardır. Join metodu ilişkilendirilen iki veri seti için kartezyen çarpım yapar. Yukarıdaki örneğe dönecek olursak, join ifadesi bize kartezyen çarpım ile toplam 7 elemanlı bir liste döner. GroupJoin ifadesi ise her bir kayıt için ilişkili verileri bir liste şeklinde döner. Yani yukarıdaki örneği group join ile yaparsak, 3 ana kayıt içeren bir liste ve her liste elemanı için ilişki verilerini tutan bir liste sonucunu alırız. Kısaca farkı ve yapıyı özetlememiz gerekirse ..

Id  Value
1   A
2   B
3   C

Id  ChildValue
1   a1
1   a2
1   a3
2   b1
2   b2

JOIN

Value ChildValue
A     a1
A     a2
A     a3
B     b1
B     b2

GROUPJOIN


Value  ChildValues
A      [a1, a2, a3]
B      [b1, b2]
C      []

GroupJoin metodunun kullanımı aşağıdaki gibidir.

var results = myList.GroupJoin(myList2, x => x.Id, y => y.ForeignId, (x, y) => new { name = x.Name ,cityList = y.ToList()}).ToList();