Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

LINQ - Yansıtma (Projection) - SelectMany Kullanım Örnekleri

Bu makalede kullanılan veri kaynağını görmek için tıklayın.

Bir LINQ sorgusunda 2 farklı veri kaynağından seçilen kayıtlar (satırlar) ortak bir alana göre birleştirilerek tek bir kayıt elde edilebilir. Bunun için from cümleciği yardımıyla seçilecek veri kaynakları ayrı ayrı bildirilebilir. Ayrıca where cümleciğinde bu veri kaynaklarındaki kayıtların birleştirilmesi için kullanılacak ortak değer belirtilerek, uygun kayıtlardan yeni kayıtlar oluşturularak seçilir. Bu işlem LINQ Yöntem Sözdizimi (LINQ Method Syntax)'nde SelectMany  yöntemi aracılığıyla yapılır ve SQL Join cümleciğine karşılık gelir.

SelectMany Birleşik From (SelectMany Compound From) Örneği 1

Bu örnek öğrenci bilgilerini içeren bir veri kaynağı ve öğrenci kulüpleri bilgilerini içeren ikinci bir veri kaynağından, kulüp kayıt numarası üzerinden birleştirme yaparak öğrenci adı ve kulüp adı verilerinden yeni bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.

var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var UyeOlunanKulupler = from Ogrenci in Ogrenciler
from Kulup in Kulupler
where Kulup.KayitNo == Ogrenci.Kulup
select new { Ogrenci.Adi, KulupAdi = Kulup.Adi };

Console.WriteLine("Öğrenciler ve kulüpleri :");

foreach (var Satir in UyeOlunanKulupler)
{
Console.WriteLine("{0}, {1} kulübüne üye.", Satir.Adi, Satir.KulupAdi);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :
Öğrenciler ve kulüpleri :
Tuncay, Gezi kulübüne üye.
Jale, Tiyatro kulübüne üye.
Tekin, Tiyatro kulübüne üye.
Mesut, Tiyatro kulübüne üye.
Veli, Müzik kulübüne üye.
Ahmet, Müzik kulübüne üye.
Fatma, Tiyatro kulübüne üye.
Mehmet, Gezi kulübüne üye.
Hale, Tiyatro kulübüne üye.
Ayşe, Tiyatro kulübüne üye.
Cevdet, Müzik kulübüne üye.
Nuri, Müzik kulübüne üye.
Kenan, Gezi kulübüne üye.
Lale, Gezi kulübüne üye.
Erhan, Tiyatro kulübüne üye.
Erhan, Tiyatro kulübüne üye.
Erhan, Tiyatro kulübüne üye.
Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir:
var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var UyeOlunanKulupler =

Ogrenciler.SelectMany(Ogrenci =>
Kulupler.Where(Kulup => Kulup.KayitNo == Ogrenci.Kulup)
,
(Ogrenci, Kulup) =>
new {
Ogrenci.Adi,
KulupAdi = Kulup.Adi
}
);

Console.WriteLine("Öğrenciler ve kulupleri :");

foreach (var Satir in UyeOlunanKulupler)
{
Console.WriteLine("{0}, {1} kulübüne üye.", Satir.Adi, Satir.KulupAdi);
}
Console.ReadLine();
SelectMany yönteminin aldığı 2 parametreden birincisi, SelectMany uygulanan veri kaynağının (örneğimizde Ogrenciler ) hangi veri kaynağı ile hangi ortak alan üzerinden birleştirileceğini (örneğimizide Kulup.KayitNo  ve Ogrenci.Kulup ), ikincisi nelerin seçileceğini (örneğimizde öğrenci adı ve kulüp adı) belirler.

Bu örnekte new { Ogrenci.Adi, KulupAdi = Kulup.Adi } ifadesinde birinci özelliğin adı belirtilmemiştir. Yani isimsiz tip new { Adi = Ogrenci.Adi, KulupAdi = Kulup.Adi }  şeklinde yazılmamıştır. Böyle bir durumda özellik adı olarak seçilen özelliğin adı (örneğimizde Ogrenci.Adi bölümündeki Adi) kullanılacaktır.

SelectMany Birleşik From (SelectMany Compound From) Örneği 2

Bu örnek öğrenci bilgilerini içeren bir veri kaynağı ve öğrenci kulüpleri bilgilerini içeren ikinci bir veri kaynağından, bir önceki örnekten bir parça daha karmaşık bir where cümleciği kullanarak pekiyi alan öğrencileri ve kulup adlarınından yeni bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.

Görüldüğü gibi bir where cümleciğinde mantıksal karşılaştırma operatörleri (and, or vb.) kullanılarak farklı durumlara göre birleştirmeler yapılabilir.

var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var UyeOlunanKulupler = from Ogrenci in Ogrenciler
from Kulup in Kulupler
where Ogrenci.Ortalama >= 85 && Kulup.KayitNo == Ogrenci.Kulup
select new { Ogrenci.Adi, KulupAdi = Kulup.Adi };

Console.WriteLine("Ortalaması pekiyi olan öğrenciler ve kulüpleri :");

foreach (var Satir in UyeOlunanKulupler)
{
Console.WriteLine("{0}, {1} kulübüne üye.", Satir.Adi, Satir.KulupAdi);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :
Ortalaması pekiyi olan öğrenciler ve kulüpleri :
Jale, Tiyatro kulübüne üye.
Fatma, Tiyatro kulübüne üye.
Erhan, Tiyatro kulübüne üye.
Erhan, Tiyatro kulübüne üye.
Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir:
var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var UyeOlunanKulupler =
Ogrenciler.SelectMany(Ogrenci =>
Kulupler.Where(Kulup =>
Kulup.KayitNo == Ogrenci.Kulup
&&
Ogrenci.Ortalama >= 85
)

,
(Ogrenci, Kulup) =>
new {
Ogrenci.Adi,
KulupAdi = Kulup.Adi
}
);

Console.WriteLine("Ortalaması pekiyi olan öğrenciler ve kulüpleri :");

foreach (var Satir in UyeOlunanKulupler)
{
Console.WriteLine("{0}, {1} kulübüne üye.", Satir.Adi, Satir.KulupAdi);
}
Console.ReadLine();
SelectMany yönteminin aldığı 2 parametreden birincisi, SelectMany uygulanan veri kaynağının (örneğimizde Ogrenciler) hangi veri kaynağı ile hangi ortak alan üzerinden birleştirileceğini (örneğimizide Kulup.KayitNo ve Ogrenci.Kulup ) ve diğer şartları, ikincisi nelerin seçileceğini (örneğimizde öğrenci adı ve kulüp adı) belirler.

SelectMany Birleşik From (SelectMany Compound From) Örneği 3

Bu örnek öğrenci bilgilerini içeren bir veri kaynağı ve öğrenci kulüpleri bilgilerini içeren ikinci bir veri kaynağından, bir önceki örnekten bir parça daha karmaşık bir where cümleciği kullanarak 1.1.1990 ve daha büyük doğumluların ad, doğum yılı ve üye olduğu kulüp adındanyeni bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.

Görüldüğü gibi bir where cümleciğinde mantıksal karşılaştırma operatörleri (and, or vb.) kullanılarak farklı durumlara göre birleştirmeler yapılabilir.

var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var GenclerinKulupleri = from Ogrenci in Ogrenciler
from Kulup in Kulupler
where
Ogrenci.DogumTarihi >= new DateTime(1990, 1, 1)
&&
Kulup.KayitNo == Ogrenci.Kulup
select
new { Ogrenci.Adi,
DogumYili = Ogrenci.DogumTarihi.Year,
KulupAdi = Kulup.Adi
};

Console.WriteLine("1.1.1990 ve daha sonra doğan öğrencilerin kulupleri :");

foreach (var Satir in GenclerinKulupleri)
{
Console.WriteLine("{0}, {1} kulübüne üye. Doğum yılı {2}.",
Satir.Adi,
Satir.KulupAdi,
Satir.DogumYili);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :

1.1.1990 ve daha sonra doğan öğrencilerin kulupleri :
Tuncay, Gezi kulübüne üye. Doğum yılı 2002.
Veli, Müzik kulübüne üye. Doğum yılı 1993.
Nuri, Müzik kulübüne üye. Doğum yılı 1998.
Lale, Gezi kulübüne üye. Doğum yılı 1990.
Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir:
var Ogrenciler = OgrencileriGetir();

List Kulupler = KulupleriGetir();

var GenclerinKulupleri =

Ogrenciler.SelectMany( Ogrenci =>
Kulupler.Where(Kulup =>
Kulup.KayitNo == Ogrenci.Kulup
&&
Ogrenci.DogumTarihi >= new DateTime(1900, 1, 1)
)
,
(Ogrenci, Kulup) =>
new {
Ogrenci.Adi,
DogumYili = Ogrenci.DogumTarihi.Year,
KulupAdi = Kulup.Adi
}
);

Console.WriteLine("1.1.1990 ve daha sonra doğan öğrencilerin kulupleri :");

foreach (var Satir in GenclerinKulupleri)
{
Console.WriteLine("{0}, {1} kulübüne üye. Doğum yılı {2}.",
Satir.Adi,
Satir.KulupAdi,
Satir.DogumYili);
}
Console.ReadLine();
SelectMany yönteminin aldığı 2 parametreden birincisi, SelectMany uygulanan veri kaynağının (örneğimizde Ogrenciler) hangi veri kaynağı ile hangi ortak alan üzerinden birleştirileceğini (örneğimizide Kulup.KayitNo ve Ogrenci.Kulup ) ve diğer şartları, ikincisi nelerin seçileceğini (örneğimizde öğrenci adı ve kulüp adı) belirler.

SelectMany From Ataması (SelectMany From Assignment) Örneği

Bir LINQ sorgusunda ikinci bir from kullanarak veri kaynağı içinden ikinci bir veri kaynağı kullanabiliriz.

Bu örnek öğrenci bilgilerini içeren bir veri kaynağından öğrencilerin adları ve pekiyi notlarından bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.
var Ogrenciler = OgrencileriGetir();

var OgrencilerVePekiyiNotlari =
from Ogrenci in Ogrenciler
from Notu in Ogrenci.Notlar
where Notu >= 85
select new { Ogrenci.Adi, PekiyiNotu = Notu };

Console.WriteLine("Öğrenciler aldığı pekiyi notları :");

foreach (var OgrenciVePekiyiNotu in OgrencilerVePekiyiNotlari)
{
Console.WriteLine("{0}, {1}", OgrenciVePekiyiNotu.Adi, OgrenciVePekiyiNotu.PekiyiNotu);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :
Öğrenciler aldığı pekiyi notları :
Jale, 100
Jale, 95
Jale, 97
Jale, 96
Fatma, 98
Fatma, 97
Fatma, 92
Mehmet, 97
Ayşe, 100
Ayşe, 100
Erhan, 90
Erhan, 90
Erhan, 90
Erhan, 90
Erhan, 95
Erhan, 100
Erhan, 90
Erhan, 90
Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir:
var Ogrenciler = OgrencileriGetir();

var OgrencilerVePekiyiNotlari =

Ogrenciler.SelectMany(Ogrenci =>
Ogrenci.Notlar.Where(Notu => Notu >= 85)
,
(Ogrenci, Notu) =>
new
{
Ogrenci.Adi,
PekiyiNotu = Notu
}
);

Console.WriteLine("Öğrenciler aldığı pekiyi notları :");

foreach (var OgrenciVePekiyiNotu in OgrencilerVePekiyiNotlari)
{
Console.WriteLine("{0}, {1}", OgrenciVePekiyiNotu.Adi, OgrenciVePekiyiNotu.PekiyiNotu);
}
Console.ReadLine();
SelectMany yönteminin aldığı 2 parametreden birincisi, SelectMany uygulanan veri kaynağının (örneğimizde Ogrenciler) hangi veri kaynağı ile hangi ortak alan üzerinden birleştirileceğini (örneğimizide Kulup.KayitNo ve Ogrenci.Kulup ) ve diğer şartları, ikincisi nelerin seçileceğini (örneğimizde öğrenci adı ve kulüp adı) belirler.

SelectMany Çoklu From (SelectMany Multiple From) Örneği

Bir LINQ sorgusunda çoklu from kullanımından başka, from ve where kullanan alt sorgular ile seçimler yapılarak bir sorgu oluşturulabilir.

Bu örnek öğrenci bilgilerini içeren bir veri kaynağındaki 4. sınıf öğrencilerinin aldığı zayıf notlarla öğrenci adlarından bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.
var Ogrenciler = OgrencileriGetir();
int GecerNot = 55;

var DorduncuSiniflarinZayiflari =
from Ogrenci in Ogrenciler
where Ogrenci.Sinif == 4
from Notu in Ogrenci.Notlar
where Notu < GecerNot
select new { Ogrenci.Adi, ZayifNotu = Notu };

Console.WriteLine("4. sınıf öğrencilerin aldığı zayıf notlar:");

foreach (var Satir in DorduncuSiniflarinZayiflari)
{
Console.WriteLine("{0}, {1}.", Satir.Adi, Satir.ZayifNotu);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :
4. sınıf öğrencilerin aldığı zayıf notlar:
Mesut, 10.
Mesut, 30.
Veli, 40.
Veli, 10.
Mehmet, 22.
Aynı örnek, LINQ Yöntem Sözdizimi (LINQ Method Syntax) ile şu şekilde yazılabilir:
var Ogrenciler = OgrencileriGetir();
int GecerNot = 55;

var DorduncuSiniflarinZayiflari =
Ogrenciler.Where(Ogrenci => Ogrenci.Sinif == 4)
.SelectMany(Ogrenci => Ogrenci.Notlar.Where(Notu => Notu < GecerNot)
,
(Ogrenci, Notu) =>
new
{
Ogrenci.Adi,
ZayifNotu = Notu
}
);

Console.WriteLine("4. sınıf öğrencilerin aldığı zayıf notlar:");

foreach (var Satir in DorduncuSiniflarinZayiflari)
{
Console.WriteLine("{0}, {1}.", Satir.Adi, Satir.ZayifNotu);
}
Console.ReadLine();
SelectMany yönteminin aldığı 2 parametreden birincisi, SelectMany uygulanan veri kaynağının (örneğimizde Ogrenciler) hangi veri kaynağı ile hangi ortak alan üzerinden birleştirileceğini (örneğimizide Kulup.KayitNo ve Ogrenci.Kulup ) ve diğer şartları, ikincisi nelerin seçileceğini (örneğimizde öğrenci adı ve kulüp adı) belirler.

Dizinli SelectMany (SelectMany Indexed) Örneği

SelectMany metodu sıradaki elemanın sıra numarasını (index) döndüren 2. bir kullanıma sahiptir. Bu şekilde elamanın sıra numarası ile ilgili yapılacak işlemler gerçekleştirilebilir.

Bu örnek öğrenci bilgilerini içeren bir veri kaynağındaki öğrencilerin kayıt sıraları ve notlarından bir isimsiz tip oluşturup seçer ve bunu bir foreach döngüsü ile çıktıya yazar.
var Ogrenciler = OgrencileriGetir();

var OgrencilerinTumNotlari =
Ogrenciler.SelectMany(
(Ogrenci, Index) =>
Ogrenci.Notlar.Select(Notu => new {
Sira = (Index + 1),
Not = Notu
}
)
);

Console.WriteLine("Öğrencilerinin kayıt sırasına göre notları :");

foreach (var Satir in OgrencilerinTumNotlari)
{
Console.WriteLine("{0}. sıradaki öğrencimizin bir notu {1}.",
Satir.Sira, Satir.Not);
}
Console.ReadLine();
Örneğin çıktısı şöyle olacaktır :
Öğrencilerinin kayıt sırasına göre notları :
1. sıradaki öğrencimizin bir notu 75.
1. sıradaki öğrencimizin bir notu 70.
1. sıradaki öğrencimizin bir notu 75.
2. sıradaki öğrencimizin bir notu 100.
2. sıradaki öğrencimizin bir notu 95.
2. sıradaki öğrencimizin bir notu 97.
2. sıradaki öğrencimizin bir notu 96.
3. sıradaki öğrencimizin bir notu 30.
3. sıradaki öğrencimizin bir notu 40.
3. sıradaki öğrencimizin bir notu 20.
.
.
.
17. sıradaki öğrencimizin bir notu 90.
17. sıradaki öğrencimizin bir notu 55.
17. sıradaki öğrencimizin bir notu 90.

Kaynak:
https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b



Diğer LINQ Makaleleri:


Yazan: 10.04.16 20:35

101,387p 4ü