LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#)
Giriş niteliğindeki Dil Tümleşik Sorgu (LINQ) belgelerindeki sorguların çoğu LINQ bildirim temelli sorgu söz dizimi kullanılarak yazılır. Ancak, kod derlendiğinde sorgu söz diziminin .NET ortak dil çalışma zamanı (CLR) için yöntem çağrılarına çevrilmesi gerekir. Bu yöntem çağrıları, , Select
, Max
GroupBy
Join
ve Average
gibi Where
adlara sahip standart sorgu işleçlerini çağırır. Sorgu söz dizimi yerine yöntem söz dizimini kullanarak bunları doğrudan çağırabilirsiniz.
Sorgu söz dizimi ve yöntem söz dizimi diğer bir şekilde aynıdır, ancak birçok kişi sorgu söz dizimini daha basit ve daha kolay okunur bulur. Bazı sorgular yöntem çağrıları olarak ifade edilmelidir. Örneğin, belirtilen koşulla eşleşen öğelerin sayısını alan bir sorguyu ifade etmek için yöntem çağrısı kullanmanız gerekir. Ayrıca, bir kaynak dizisinde en yüksek değere sahip öğeyi alan bir sorgu için yöntem çağrısı kullanmanız gerekir. Ad alanında standart sorgu işleçleri için başvuru belgelerinde System.Linq genellikle yöntem söz dizimi kullanılır. Bu nedenle, LINQ sorguları yazmaya başlarken bile sorgularda ve sorgu ifadelerinde yöntem söz dizimini kullanmayı öğrenmek yararlıdır.
Standart Sorgu İşleci Genişletme Yöntemleri
Aşağıdaki örnekte basit bir sorgu ifadesi ve yöntem tabanlı sorgu olarak yazılmış olan eş değere eşdeğer sorgu gösterilmektedir.
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 örnekten alınan çıkış aynıdır. Sorgu değişkeninin türünün her iki biçimde de aynı olduğunu görebilirsiniz: IEnumerable<T>.
Yöntem tabanlı sorguyu anlamak için sorguyu daha yakından inceleyelim. İfadenin sağ tarafında yan tümcesinin where
nesnesi üzerinde numbers
bir örnek yöntemi olarak ifade edildiğine dikkat edin. Hatırlayacağınız gibi türündedir IEnumerable<int>
. Genel IEnumerable<T> arabirimi biliyorsanız, bir Where
yöntemi olmadığını biliyorsunuz. Ancak, Visual Studio IDE'de IntelliSense tamamlama listesini çağırırsanız, yalnızca bir Where
yöntemi değil, aynı zamanda , SelectMany
, Join
ve Orderby
gibi Select
diğer birçok yöntemi görürsünüz. Bunların tümü standart sorgu işleçleridir.
Bu ek yöntemleri içerecek şekilde yeniden tanımlanmış gibi IEnumerable<T> görünse de, aslında durum böyle değildir. Standart sorgu işleçleri , uzantı yöntemleri olarak adlandırılan yeni bir yöntem türü olarak uygulanır. Uzantı yöntemleri mevcut bir türü "genişletir"; türünde örnek yöntemleriymiş gibi çağrılabilirler. Standart sorgu işleçleri genişler IEnumerable<T> ve bu nedenle yazabilirsiniz numbers.Where(...)
.
LINQ kullanmaya başlamak için uzantı yöntemleri hakkında bilmeniz gereken tek şey, doğru using
yönergeleri kullanarak bunları uygulamanızda kapsama nasıl getireceğinizdir. Uygulamanızın bakış açısından bir uzantı 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çlerine Genel Bakış (C#). LINQ to SQL ve LINQ to XML gibi bazı LINQ sağlayıcıları kendi standart sorgu işleçlerini ve dışında IEnumerable<T>diğer türler için ek uzantı yöntemlerini uygular.
Lambda İfadeleri
Önceki örnekte, koşullu ifadenin (num % 2 == 0
) yöntemine Where
satır içi bağımsız değişken olarak geçirildiğini göreceksiniz: Where(num => num % 2 == 0).
Bu satır içi ifade lambda ifadesi olarak adlandırılır. Aksi takdirde anonim bir yöntem veya genel bir temsilci ya da ifade ağacı olarak daha hantal bir biçimde yazılması gereken kod yazmanın kullanışlı bir yoludur. C# =>
dilinde lambda işlecidir ve "gider" olarak okunur. num
işlecinin sol tarafında, sorgu ifadesindeki öğesine num
karşılık gelen giriş değişkeni yer alır. Derleyici, türünün genel IEnumerable<T> bir tür num
olduğunu numbers
bildiği için türünü çıkarsayabilir. Lambda gövdesi, sorgu söz dizimindeki veya başka bir C# ifadesi veya deyimindeki 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 sonucudur.
LINQ kullanmaya başlamak için lambdaları kapsamlı bir şekilde kullanmanız gerekmez. Ancak, bazı sorgular yalnızca yöntem söz diziminde ifade edilebilir ve bazıları lambda ifadeleri gerektirir. Lambdalar hakkında daha fazla bilgi edindikten sonra, BUNLARıN LINQ araç kutunuzda güçlü ve esnek bir araç olduğunu göreceksiniz. Daha fazla bilgi için bkz. Lambda İfadeleri.
Sorgu Oluşturabilirliği
Önceki kod örneğinde yönteminin OrderBy
çağrısındaki nokta işleci kullanılarak çağrıldığına Where
dikkat edin. Where
filtrelenmiş bir dizi oluşturur ve ardından Orderby
sıralayarak bu dizi üzerinde çalışır. Sorgular bir IEnumerable
döndüreceği için, yöntem çağrılarını birbirine zincirleyerek bunları yöntem söz diziminde oluşturursunuz. Sorgu söz dizimini kullanarak sorgu yazdığınızda derleyici arka planda bunu yapar. Sorgu değişkeni sorgunun sonuçlarını depolamadığından, sorguyu değiştirebilir veya yürütüldükten sonra bile istediğiniz zaman yeni bir sorgunun temeli olarak kullanabilirsiniz.