GroupJoin
GroupJoin ile one-to-many birleştirmeyi öğrenirsin.
GroupJoin ile hiyerarşi
GroupJoin, Join'in gruplayan halidir. Her dış elemanı, eşleşen iç elemanların bir dizisiyle eşler; eşleşme olmasa bile dış eleman sonuçta kalır. Bu, bir-çok (one-to-many) ilişkiler için idealdir.
Örnek: categories.GroupJoin(products, c => c.Id, p => p.CategoryId, (c, prods) => ...). Her kategori, ürünlerinden oluşan bir dizi ile birlikte gelir; ürünü olmayan kategori boş dizi alır ama atılmaz.
GroupJoin ne zaman kullanılır
Bir kategorinin tüm ürünlerini, bir sınıfın tüm öğrencilerini ya da bir müşterinin tüm siparişlerini listelemek istediğinde GroupJoin uygundur. Eşleşmeyen dış elemanların atılmasını istemiyorsan Join yerine bunu kullan.
Sonuç seçici, iç diziyi IEnumerable<T> olarak alır; prods.Count() ya da foreach ile elemanlarına ulaşabilirsin. Bu, SQL sol dış birleşimine (left outer join) benzer.
Uygulama Kategorileri ürünlerle grupla
Aşağıdaki categories ve products listelerini GroupJoin ile Id/CategoryId üzerinden birleştir. Her kategori için kategori adı ve ürün adedini Console.WriteLine ile yazdır.
Örnek çözümü göster
" + prods.Count()); ile birleştir. foreach ile her sonucu yazdır.
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Linq;
class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
class Product
{
public string Name { get; set; }
public int CategoryId { get; set; }
}
class Program
{
static void Main()
{
var categories = new List<Category>
{
new Category { Id = 1, Name = "İçecek" },
new Category { Id = 2, Name = "Tatlı" }
};
var products = new List<Product>
{
new Product { Name = "Çay", CategoryId = 1 },
new Product { Name = "Kahve", CategoryId = 1 },
new Product { Name = "Künefe", CategoryId = 2 }
};
var result = categories.GroupJoin(products, c => c.Id, p => p.CategoryId, (c, prods) => c.Name + ": " + prods.Count());
foreach (var r in result)
{
Console.WriteLine(r);
}
}
}
Kendini test et
-
Metodu davranışa eşle
- Join
- Yalnız eşleşen çiftler
- GroupJoin
- Dış + iç dizi
- GroupBy
- Tek diziyi grupla
- Zip
- İndeks bazlı çift
-
GroupJoin çağrısını tamamla
var result = categories.Group____(products, c => c.Id, p => p.CategoryId, (c, prods) => c.Name);Cevabı göster
var result = categories.GroupJoin(products, c => c.Id, p => p.CategoryId, (c, prods) => c.Name); -
GroupJoin ne üretir?
- Yalnız eşleşen çiftleri
- Tek bir değer
- Dış eleman + iç dizi
- Sıralı bir dizi
Cevabı göster
Dış eleman + iç dizi — Doğru. GroupJoin her dış elemanı eşleşen iç dizisiyle verir.