Sorgu, bir veri kaynağından veri alan bir ifadedir. Sorgular genellikle özel bir sorgu dilinde ifade edilir.
LINQ, çeşitli veri kaynakları ve biçimlerinde verilerle çalışmak için tutarlı bir model sunarak bu durumu basitleştirir. LINQ sorgusunda her zaman nesnelerle çalışırsınız.
LINQ; açılımı Dil Tümleşik Sorgu Dile Entegre edilmiş sorgudur. Microsoft tarafından kullanılan ve C# 3.0 ile hayatımıza giren farklı veri kaynaklarından sorgulama yapabilmemize imkan verir. LINQ, bir programlama arayüzü sunar. C# diline getirdiği eklentilerle SQL benzeri tek bir söz dizimi ile farklı tiplerdeki verilerin sorgulanmasını sağlar.
LINQ Zihin Haritası
LINQ zihin haritasını https://steven-giesel.com/ web sitesinde görmüştüm. Net 7’de var olan tüm LINQ işlemlerini içerecek şekilde hazırlanmış.

Denemeler yaparken mevcuttaki tüm yöntemleri öğrenmek bunaltıcı olabiliyor bu sebeple onları kategoriler halinde yansıtılmış. İnanın bana, LINQ öğrenmek için zaman ayırmanız uzun vadede karşılığını verecektir – kodunuz daha net ve okunması daha kolay olacaktır.
LinQ İşlevleri
Bu blog yazısı, daha küçük parçalara ayrılmış birçok LINQ işlevini gösterecektir. Her zaman bir bilgi grafiği ile başlayacak ve daha sonra açıklanacaktır.

Select
Select ile bir öğeden diğerine bir projeksiyon oluşturuyoruz. Basitçe söylemek gerekirse, belirli bir tipimizden istenen bir tipe eşliyoruz. Sonuç kümesi, kaynak kümeyle aynı miktarda öğeye sahiptir.
Where
Burada doğru/yanlış koşullarına göre filtreler. Verilen örnekte sadece yeşil dairelere sahip olmak istiyoruz. Sonuç kümesi aynı, daha az ve hatta boş olabilir.
SelectMany
SelectMany, listeleri düzleştirmek için kullanılır. Liste içinde bir listeniz varsa, bunu tek boyutlu bir gösterime düzleştirmek için kullanabiliriz.
Zip
Zip ile iki listeyi belirli bir birleştirme işleviyle “birleştiririz”. Şeritlerden herhangi birinde nesneler bitene kadar nesneleri birleştiriyoruz. Örnekte görüldüğü gibi: Birinci kulvarda 2 eleman, ikinci kulvarda 3 eleman vardır. Dolayısıyla sonuç kümesi sadece 2 eleman içerir.
OrderBy
OrderBy, karşılaştırma işleviniz veya içsel bir işlev tarafından verilen listeyi sıralar (örn. .NET, sayıları nasıl sıralayacağını bilir). OrderBy ve OrderByDescending kararlıdır. Sonuç kümesi, kaynak kümeyle aynı miktarda öğeye sahiptir.
Distinct
Distinct, tüm kopyaların kaldırıldığı, bir Set gibi yeni bir numaralandırılabilir döndürür. Referans türü için varsayılanın, yanlış sonuçlara yol açabilecek referansların eşitliğini kontrol etmek olduğuna dikkat edin. Sonuç kümesi aynı veya daha küçük olabilir.

Aggregate
Tüm elemanlara bir işlem uygulayarak birleştirmek için kullanılır. Aggregate metodu şöyle çalışır. ilk eleman için bir sonuç üretilir. Aynı sonuç ikinci elemanı çağırırken a parametresi olarak geçilir. Böylece birleştirme işlemi yerine getirilir.
Ana fikri bir dizi girdiyi tek bir değerde toplamak/azaltmaktır. Her zaman başlangıç değeriyle başlar ve listedeki her bir öğe, üstte kullanıcı tarafından verilen işlev tarafından toplanır.
Chunk
.NET6 ile tanıtılan bu hoş yardımcı, belirli bir listeden daha küçük alt listeler oluşturur. Bir listeden daha küçük alt gruplar oluşturduğunuzu hayal edin.
Union
İki listenin birleşimi, her iki listenizde de bulunan her bir farklı öğeyle sonuçlanacaktır. Bir küme gibi davranır, bu nedenle yinelenen öğeler kaldırılır. Her iki listenin bir arada olduğunu hayal edin ve Distinct’i arayın.
Intersect
Union’a benzer şekilde çalışır, ancak şimdi A listesinde VE B listesinde hangi öğelerin bulunduğunu kontrol ediyoruz. Yalnızca her ikisinde de bulunan öğeler sonuç kümesinde olacaktır. Ayrıca burada: Yeni listede yalnızca benzersiz öğeler var. Kopyalar otomatik olarak kaldırılır.
Any
En az bir öğenin koşulunuzu karşılayıp karşılamadığını kontrol eder. Eğer öyleyse, doğru döndürür. Koşulu karşılayan bir öğe yoksa, o zaman false döndürür. Any ayrıca bir öğe bulduğunda işlemeyi hemen durdurur.
All
Adından da anlaşılacağı gibi, listedeki TÜM öğelerinizin belirli bir koşulu karşılayıp karşılamadığını kontrol eder. Eğer öyleyse true, aksi takdirde false döndürür. ALL, koşulu sağlamayan bir öğe bulursa, işlemeyi hemen durdurur ve false döndürür.
Append
Ekle, verilen öğeyi listenin sonuna koyar.
Prepend
Verilen öğeyi listenin başına koyar.

MaxBy
MaxBy ve MinBy ile sınıfımızın bir özelliğine projeksiyon yapabilir ve bu özelliğin “en büyük” olduğu nesneyi elde edebiliriz.
DistinctBy
DistinctBy, Distinct’e benzer şekilde çalışır, ancak nesnenin kendisinin seviyesi yerine, belirgin bir sonuç kümesine sahip olmak istediğimiz bir özelliğe bir izdüşüm tanımlayabiliriz.
ToLookup
Bu yöntemler bir arama oluşturur. Bir arama, nesnelerin listesine (1’den n’ye ilişki) işaret edebilen bir anahtarımız olduğu tanımlanır. İlk bağımsız değişken “anahtar” seçiciyi alır. İkinci seçici “değer”dir. Bu, nesnenin kendisi veya nesnenin kendisinin bir özelliği olabilir. Sonunda, değerlerin tam olarak bu anahtarı paylaştığı farklı anahtarların bir listesine sahibiz. Bir LookUp nesnesi sabittir. Daha sonra öğe ekleyemezsiniz.
ToDictionary
ToDictionary, önemli bir farkla ToLookup’a benzer şekilde çalışır. ToDictionary yöntemi yalnızca 1’e 1 ilişkilere izin verir. İki öğe aynı anahtarı paylaşırsa, anahtarın zaten mevcut olduğu bir hata ile sonuçlanacaktır.
Join
Join, SQL’deki Left-Join’e benzer bir şekilde çalışır. Katılmak istediğimiz iki setimiz var. Sonraki iki bağımsız değişken, her listenin “anahtar” seçicileridir. Join’in temel olarak yaptığı şey, A listesindeki her öğeyi alıp verilen “anahtar seçici” ile b listesinin anahtar seçicisiyle karşılaştırmasıdır. Eşleşirse, bu iki öğeden oluşabilen yeni bir C nesnesi oluşturabiliriz.

Take
Al, verilen miktarda öğeyi “almamızı” sağlar. Dizide almak istediğimizden daha az öğe varsa, Take() yalnızca kalan nesneleri döndürür.
Skip
Atla ile verilen miktarda öğeyi görmezden gelerek atlarız. Linq’teki Skip methodu, bir veri kaynağından veya diziden ilk “n” öğe sayısını atlamak veya atlamak için kullanılır ve ardından veri kaynağından kalan öğeleri çıktı olarak döndürür. Burada “n”, Skip yöntemine parametre olarak iletilen bir tam sayı değeridir. Listemizin tuttuğundan daha fazla öğeyi atlarsak, boş bir numaralandırma elde ederiz. Birlikte skip and take, sayfalandırma gibi şeyler için çok güçlü olabilir.
OfType
OfType, numaralandırmadaki her öğenin belirli bir tür olup olmadığını kontrol eder (miras alınan türler de bu tür olarak sayılır) ve bunları yeni bir numaralandırma da döndürür. Bu, özellikle türlenmemiş dizilerimiz (nesne) varsa veya verilen numaralandırmanın özel bir alt sınıfını istiyorsak yardımcı olur.
GroupBy
GroupBy, numaralandırmayı belirli bir anahtar alanına göre gruplandırır. Bu kesin anahtarı paylaşan tüm öğeler birlikte gruplanır. Çok büyük bir farkla “ToLookup” ile neredeyse aynıdır. GroupBy, “Bunları gruba göre düzenleseydim bu şeyler nasıl görünürdü?” sorusunu temsil eden bir nesne oluşturuyorum anlamına gelir.
Reverse
Verilen numaralandırmanın tersine çevrilmiş bir sürümünü döndürür.
First()
First metodu bir koleksiyon içerisinden ilk elemanı seçmek için kullanılmaktadır. Eğer her hangi bir koşula bağlanmışsa koşul sonucu çıkan ilk değeri yansıtır. Hiçbir öğe bulunamadığında ise bir uyarı atar.
Single()
Bir sonuç kümesinden tek bir elemanın seçileceği işlemler için Single, eğer şartımız sağlanmaz ve sonuç kümesinden herhangi bir değer gelmez ise tipin varsayılan değerini döndürmek için SingleOrDefault metodları kullanılmaktadır.
FirstOrDefault
SingleOrDefault
Verilen numaralandırma da hiçbir öğe bulunmazsa, varsayılanı döndürür Referans türleri için null ve değer türleri için verilen default değeri döndürür.
Yazarın bu konulardaki detaylı açıklamalarını kitabında bulabilirsiniz.
https://linkdotnetblogstorage.azureedge.net/blog/20220811_LinqWithSketchesEBook/LINQ.pdf