LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#)
Giriş dili tümleşik sorgu (LINQ) belgelerinde yer alan sorguların çoğu LINQ bildirimli sorgu söz dizimi kullanılarak yazılır. Ancak, kod derlenmiş olduğunda sorgu söz dizimi .NET ortak dil çalışma zamanı (CLR) için yöntem çağrılarına çevrilebilir. Bu yöntem çağrıları , ve gibi adlara sahip standart sorgu Where Select GroupBy Join Max işleçlerini Average çağırır. Bunları sorgu söz dizimi yerine yöntem söz dizimi kullanarak doğrudan çağırabilirsiniz.
Sorgu söz dizimi ve yöntem söz dizimi benzerdir, ancak birçok kişi sorgu söz dizimlerini daha basit ve daha kolay okunur olarak bulur. Bazı sorgular yöntem çağrıları olarak ifade etmek gerekir. Örneğin, belirtilen koşulla eşan öğe sayısını alan bir sorguyu ifade etmek için bir yöntem çağrısı kullanabilirsiniz. Ayrıca bir kaynak dizisinde en yüksek değere sahip öğeyi alan bir sorgu için yöntem çağrısı da kullanmalıdır. Ad alanı standart sorgu işleçleri için başvuru belgeleri System.Linq genellikle yöntem söz dizimi kullanır. Bu nedenle, LINQ sorguları yazmaya başlarken bile sorgularda ve sorgu ifadelerinde yöntem söz dizimi kullanma hakkında bilgi sahibi olmak yararlı olur.
Standart Sorgu İşleci Genişletme Yöntemleri
Aşağıdaki örnekte, basit bir sorgu ifadesi ve metot tabanlı sorgu olarak yazılmış olansemantya eşdeğer sorguyu gösterir.
class QueryVMethodSyntax
{
static void Main()
{
int[] numbers = { 5, 10, 8, 3, 6, 12};
//Query syntax:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
foreach (int i in numQuery1)
{
Console.Write(i + " ");
}
Console.WriteLine(System.Environment.NewLine);
foreach (int i in numQuery2)
{
Console.Write(i + " ");
}
// Keep the console open in debug mode.
Console.WriteLine(System.Environment.NewLine);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
/*
Output:
6 8 10 12
6 8 10 12
*/
İki örneğin çıktısı aynıdır. Sorgu değişkeninin türünün her iki şekilde de aynı olduğunu görüyorsunuz: IEnumerable<T> .
Yöntem tabanlı sorguyu anlamak için daha yakından incelenin. İfadenin sağ tarafında yan tümcesi artık nesnesinde örnek yöntemi olarak ifade edildi. Hatırlayacak olursanız bir where numbers türü IEnumerable<int> vardır. Genel arabirim hakkında bilginiz IEnumerable<T> varsa yöntemi olmadığını Where bilirsiniz. Ancak, IntelliSense tamamlanma listesini IDE'de Visual Studio çağırırsanız yalnızca bir yöntem değil, , , ve gibi diğer birçok Where Select yöntemi de SelectMany Join Orderby görürsünüz. Bunların hepsi standart sorgu işleçleridir.

Bu ek yöntemleri içerecek şekilde yeniden tanımlandı gibi görünüyor olsa IEnumerable<T> da, aslında bu durum değildir. Standart sorgu işleçleri, uzantı yöntemleri adlı yeni bir yöntem olarak uygulanır. Uzantı yöntemleri var olan bir türü "genişletiyor"; bunlar, tür üzerinde örnek yöntemleri gibi çağrılır. Standart sorgu işleçleri IEnumerable<T> genişletildi ve bu nedenle yazabilirsiniz. numbers.Where(...)
LINQ kullanmaya başlamanız için uzantı yöntemleri hakkında gerçekten tek bilmek gereken doğru yönergeleri kullanarak bunları uygulamanıza nasıl kapsam içine using almaktır. Uygulamanın bakış açısından bir genişletme yöntemi ve normal örnek yöntemi aynıdır.
Uzantı yöntemleri hakkında daha fazla bilgi için bkz. Uzantı Yöntemleri. Standart sorgu işleçleri hakkında daha fazla bilgi için bkz. Standart Sorgu İşleçleri'ne Genel Bakış (C#). ve gibi bazı LINQ sağlayıcıları, LINQ to XML diğer türler için kendi standart sorgu işleçlerini LINQ - SQL ve ek genişletme yöntemlerini IEnumerable<T> kullanır.
Lambda İfadeleri
Önceki örnekte, koşullu ifadenin ( ) yöntemine satır içi bağımsız değişken olarak geçirildiklerine dikkat et: Bu satır içi num % 2 == 0 Where Where(num => num % 2 == 0). ifade, lambda ifadesi olarak çağrılır. Aksi takdirde anonim bir yöntem veya genel bir temsilci ya da ifade ağacı olarak daha hantal bir şekilde yazacak kod yazmanın kullanışlı bir yoludur. C# => içinde , "gider" olarak okunan lambda işlecidir. numişlecinin sol tarafından, sorgu ifadesinde değerine karşılık num gelen giriş değişkeni yer almaktadır. Derleyici, türünün genel bir tür num olduğunu bildiği için türünü numbers IEnumerable<T> çıkararak. Lambda gövdesi, sorgu söz dizimsinde veya başka bir C# ifadesinde veya deyiminde yer alan ifadeyle aynıdır; Yöntem çağrılarını ve diğer karmaşık mantığı içerebilir. "Dönüş değeri" yalnızca ifade sonucu olur.
LINQ kullanmaya başlama için lambdaları kapsamlı olarak kullanmak zorunda değildir. Ancak, bazı sorgular yalnızca yöntem söz dizimlerinde ifade ed kullanılabilir ve bunlardan bazıları lambda ifadeleri gerektirir. Lambdalar hakkında daha fazla bilgi edindikten sonra, bunların LINQ araç kutunda güçlü ve esnek bir araç olduğunu bulabilirsiniz. Daha fazla bilgi için bkz. Lambda İfadeleri.
Sorgu Oluşturabilirliği
Önceki kod örneğinde yönteminin çağrısında nokta işleci kullanılarak OrderBy çağrıldısını Where unutmayın. Where filtrelenmiş bir dizi üretir ve Orderby ardından sırayla bu dizi üzerinde çalışır. Sorgular bir getiri IEnumerable olduğundan, yöntem çağrılarını zincirleerek bunları yöntem söz dizimsinde oluşturabilirsiniz. Sorgu söz dizimi kullanarak sorgular yazarken derleyici arkalarında bunu yapar. Sorgu değişkeni sorgunun sonuçlarını depolamaz, sorguyu değiştirebilir veya yürütülürken bile yeni bir sorgunun temeli olarak kullanabilirsiniz.