20.06.16 21:16
LINQ - Temel İşlemler - Birleştirme (Joining)
Birleştirme, 2 farklı listedeki değerlerin ortak bir değere göre birleştirip tek bir liste oluşturma işidir. Bunun için join cümleciği kullanılır. LINQ'daki join doğrudan tablolardan değil, nesne koleksiyonları üzerinde çalışır. Aşağıdaki örnek aynı şehirdeki müşteriler ve dağıtıcıların bir listesini verir. var birlestirilmisListe = from Musteri in Musteriler join Dagitici in Dagiticilar on Musteri.Sehir equals Dagitici.Sehir select new { MusteriAdi = Musteri.Adi, DagiticiAdi = Dagitici.Adi }; Örnekteki ifadeleri tek tek açıklayalım. from Musteri in Musteriler ifadesi musteriler isimli listeden seçim yapılacağını ve seçilene "musteri" isminin verilmesini, join Dagitici in Dagiticilar ifadesi ikinci olarak dagiticilar isimli listeden ayrıca seçim yapılacağını ve seçilene "dagitici" isminin verilmesini, on ifadesi iki listenin birleştirilme bilgisinin ne üzerinden yapılacağının kendisinden sonra bildirildiğini, Musteri.Sehir equals Dagitici.Sehir ifadesi, listelerde şehir bilgisi aynı olan (equals = eşittir) müşteriler ile dağıtıcıların seçilmesini, select new { MusteriAdi = Musteri.Adi, DagiticiAdi = Dagitici.Adi }; ifadesi, seçilenlerin yeni bir isimsiz (anonim) nesne oluşturularak bu nesnede tek bir bilgi satırı haline dönüştürülmesini ve nesnenin MusteriAdi özelliği olarak müşterilerin adının, DagiticiAdi özelliği olarak dağıtıcının adının kullanılmasını bildirir. Örneğin tamamı ve çıktısı şöyle. namespace LinQJoin1 { class Program { public class Musteri { public string Adi { get; set; } public string Soyadi { get; set; } public string Sehir { get; set; } } public static List<Musteri> MusterileriGetir() { List<Musteri> Musteriler = new List<Musteri> { new Musteri {Adi="Kenan", Soyadi="Oran", Sehir="Muğla"}, new Musteri {Adi="Erhan", Soyadi="Erkanlı", Sehir="Ankara"}, new Musteri {Adi="Ercan", Soyadi="Orak", Sehir="Ankara"}, new Musteri {Adi="Yaşar", Soyadi="Yılmaz", Sehir="Manisa"} }; return Musteriler; } public class Dagitici { public string Adi { get; set; } public string Soyadi { get; set; } public string Sehir { get; set; } } public static List<Dagitici> DagiticilariGetir() { List<Dagitici> Dagiticilar = new List<Dagitici> { new Dagitici {Adi="Tekin", Soyadi="Uğurlu", Sehir="Van"}, new Dagitici {Adi="Hasan", Soyadi="Ünlü", Sehir="Ankara"}, new Dagitici {Adi="Tuncay", Soyadi="Çağrı", Sehir="Manisa"}, new Dagitici {Adi="Mehmet", Soyadi="Emre", Sehir="Muğla"} }; return Dagiticilar; } static void Main(string[] args) { List<Musteri> musteriler = MusterileriGetir(); List<Dagitici> dagiticilar = DagiticilariGetir(); var birlestirmeSorgusu = from musteri in musteriler join dagitici in dagiticilar on musteri.Sehir equals dagitici.Sehir select new { Sehir = musteri.Sehir, MusteriAdi = musteri.Adi, DagiticiAdi = dagitici.Adi }; // LINQ Yöntem Sözdizimi ile sorgu : /* var birlestirmeSorgusu = musteriler.Join( dagiticilar, musteri => musteri.Sehir, dagitici => dagitici.Sehir, (musteri, dagitici) => new { Sehir = musteri.Sehir, MusteriAdi = musteri.Adi, DagiticiAdi = dagitici.Adi } ); */ Console.WriteLine("Şehir, Dağıtıcı - Müşteri"); Console.WriteLine("-------------------------"); foreach (var satir in birlestirmeSorgusu) { Console.WriteLine("{0}, {1} - {2}", satir.Sehir, satir.DagiticiAdi, satir.MusteriAdi); } Console.ReadKey(); } } } Çıktı : Şehir, Dağıtıcı - Müşteri ------------------------- Muğla, Mehmet - Kenan Ankara, Hasan - Erhan Ankara, Hasan - Ercan Manisa, Tuncay - Yaşar Not : Örneğimizdeki select cümleciğinde bir isimsiz sınıf kullandığımızdan foreach döngüsündeki satir değişkenini tip adını bilemeyeceğimizden dolayı mecburen var ile tanımlıyoruz (İsimsiz sınıfların isimleri derleyici tarafından derleme sırasında verilir). Diğer LINQ Makaleleri: LINQ Örnekleri makalelerinde kullanılan verikaynağı LINQ (Language Integrated Query - Dile Entegre Edilmiş Sorgu) Nedir? LINQ Sağlayıcıları (LINQ Providers) LINQ Yöntem Sözdizimi (LINQ Method Syntax) LINQ - Temel İşlemler - Bir Veri Kaynağı Bildirme ve Seçme (From ve Select) LINQ - Temel İşlemler - Süzme (Filtering) LINQ - Temel İşlemler - Sıralama (Ordering) LINQ - Temel İşlemler - Gruplama (Grouping) LINQ - Temel İşlemler - Birleştirme (Joining) (Bu makale) LINQ - Deferred Execution - Ertelenmiş Çalıştırma LINQ - Immediate Execution - Anında Çalıştırma LINQ - Query Reuse - Sorgunun Yeniden Kullanımı LINQ - Kısıtlama (Restriction) Kullanım Örnekleri LINQ - Yansıtma (Projection) - Select Kullanım Örnekleri LINQ - Yansıtma (Projection) - SelectMany Kullanım Örnekleri LINQ - Bölümleme (Partitioning) Örnekleri LINQ - Sıralama (Ordering) Örnekleri LINQ - Gruplama (Grouping) Örnekleri LINQ - Küme (Set) Örnekleri LINQ - Dönüşüm (Conversion) Örnekleri LINQ - Eleman (Element) Seçimi Örnekleri LINQ - Oluşturma (Generation) Örnekleri LINQ - Miktar Belirleyiciler (Quantifiers) Örnekleri LINQ - Yığın (Aggregate) Örnekleri LINQ - Birleştirme (Join) İşlemleri LINQ - Özel Dizilim (Custom Sequence) Örneği LINQ - Concat ve SequenceEqual İle Örnekle r
Ekleyen: canora
Değiştiren: canora
09.04.16 20:49
LINQ - Temel İşlemler - Birleştirme (Joining)
Birleştirme, 2 farklı listedeki değerlerin ortak bir değere göre birleştirip tek bir liste oluşturma işidir. Bunun için join cümleciği kullanılır. LINQ'daki join doğrudan tablolardan değil, nesne koleksiyonları üzerinde çalışır. Aşağıdaki örnek aynı şehirdeki müşteriler ve dağıtıcıların bir listesini verir. var birlestirilmisListe = from Musteri in Musteriler join Dagitici in Dagiticilar on Musteri.Sehir equals Dagitici.Sehir select new { MusteriAdi = Musteri.Adi, DagiticiAdi = Dagitici.Adi }; Örnekteki ifadeleri tek tek açıklayalım. from Musteri in Musteriler ifadesi musteriler isimli listeden seçim yapılacağını ve seçilene "musteri" isminin verilmesini, join Dagitici in Dagiticilar ifadesi ikinci olarak dagiticilar isimli listeden ayrıca seçim yapılacağını ve seçilene "dagitici" isminin verilmesini, on ifadesi iki listenin birleştirilme bilgisinin ne üzerinden yapılacağının kendisinden sonra bildirildiğini, Musteri.Sehir equals Dagitici.Sehir ifadesi, listelerde şehir bilgisi aynı olan (equals = eşittir) müşteriler ile dağıtıcıların seçilmesini, select new { MusteriAdi = Musteri.Adi, DagiticiAdi = Dagitici.Adi }; ifadesi, seçilenlerin yeni bir isimsiz (anonim) nesne oluşturularak bu nesnede tek bir bilgi satırı haline dönüştürülmesini ve nesnenin MusteriAdi özelliği olarak müşterilerin adının, DagiticiAdi özelliği olarak dağıtıcının adının kullanılmasını bildirir. Örneğin tamamı ve çıktısı şöyle. namespace LinQJoin1 { class Program { public class Musteri { public string Adi { get; set; } public string Soyadi { get; set; } public string Sehir { get; set; } } public static List<Musteri> MusterileriGetir() { List<Musteri> Musteriler = new List<Musteri> { new Musteri {Adi="Kenan", Soyadi="Oran", Sehir="Muğla"}, new Musteri {Adi="Erhan", Soyadi="Erkanlı", Sehir="Ankara"}, new Musteri {Adi="Ercan", Soyadi="Orak", Sehir="Ankara"}, new Musteri {Adi="Yaşar", Soyadi="Yılmaz", Sehir="Manisa"} }; return Musteriler; } public class Dagitici { public string Adi { get; set; } public string Soyadi { get; set; } public string Sehir { get; set; } } public static List<Dagitici> DagiticilariGetir() { List<Dagitici> Dagiticilar = new List<Dagitici> { new Dagitici {Adi="Tekin", Soyadi="Uğurlu", Sehir="Van"}, new Dagitici {Adi="Hasan", Soyadi="Ünlü", Sehir="Ankara"}, new Dagitici {Adi="Tuncay", Soyadi="Çağrı", Sehir="Manisa"}, new Dagitici {Adi="Mehmet", Soyadi="Emre", Sehir="Muğla"} }; return Dagiticilar; } static void Main(string[] args) { List<Musteri> musteriler = MusterileriGetir(); List<Dagitici> dagiticilar = DagiticilariGetir(); var birlestirmeSorgusu = from musteri in musteriler join dagitici in dagiticilar on musteri.Sehir equals dagitici.Sehir select new { Sehir = musteri.Sehir, MusteriAdi = musteri.Adi, DagiticiAdi = dagitici.Adi }; // LINQ Yöntem Sözdizimi ile sorgu : /* var birlestirmeSorgusu = musteriler.Join( dagiticilar, musteri => musteri.Sehir, dagitici => dagitici.Sehir, (musteri, dagitici) => new { Sehir = musteri.Sehir, MusteriAdi = musteri.Adi, DagiticiAdi = dagitici.Adi } ); */ Console.WriteLine("Şehir, Dağıtıcı - Müşteri"); Console.WriteLine("-------------------------"); foreach (var satir in birlestirmeSorgusu) { Console.WriteLine("{0}, {1} - {2}", satir.Sehir, satir.DagiticiAdi, satir.MusteriAdi); } Console.ReadKey(); } } } Çıktı : Şehir, Dağıtıcı - Müşteri ------------------------- Muğla, Mehmet - Kenan Ankara, Hasan - Erhan Ankara, Hasan - Ercan Manisa, Tuncay - Yaşar Not : Örneğimizdeki select cümleciğinde bir isimsiz sınıf kullandığımızdan foreach döngüsündeki satir değişkenini tip adını bilemeyeceğimizden dolayı mecburen var ile tanımlıyoruz (İsimsiz sınıfların isimleri derleyici tarafından derleme sırasında verilir).
Ekleyen: canora