LINQ'i Destekleyen C# Özellikleri

Sorgu İfadeleri

Sorgu ifadeleri, koleksiyonları sorgulamak System.Collections.Generic.IEnumerable<T> için SQL veya XQuery'ye benzer bildirim temelli bir söz dizimi kullanır. Derleme zamanında sorgu söz dizimi, LINQ sağlayıcısının standart sorgu yöntemlerini uygulamasına yönelik yöntem çağrılarına dönüştürülür. Uygulamalar, bir using yönergeyle uygun ad alanını belirterek kapsamdaki standart sorgu işleçlerini denetler. Aşağıdaki sorgu ifadesi bir dizi dize alır, bunları dizedeki ilk karaktere göre gruplandırır ve grupları sıralar.

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

Örtük Olarak Yazılan Değişkenler (var)

Burada gösterildiği gibi, derleyiciye türü çıkarmasını ve atamasını bildirmek için var değiştiricisini kullanabilirsiniz:

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

olarak var bildirilen değişkenler, türünü açıkça belirttiğiniz değişkenler gibi kesin olarak yazılır. kullanımı var anonim türler oluşturmayı mümkün kılar, ancak yalnızca yerel değişkenler için. Daha fazla bilgi için bkz . Örtük Olarak Yazılan Yerel Değişkenler.

Nesne ve Koleksiyon Başlatıcıları

Nesne ve koleksiyon başlatıcıları, nesne için bir oluşturucuyu açıkça çağırmadan nesneleri başlatmayı mümkün hale getirir. Başlatıcılar genellikle kaynak verileri yeni bir veri türüne yansıttığında sorgu ifadelerinde kullanılır. public Name ve Phone properties ile adlı Customer bir sınıf varsayıldığında, nesne başlatıcı aşağıdaki kodda olduğu gibi kullanılabilir:

var cust = new Customer { Name = "Mike", Phone = "555-1212" };

Sınıfınıza Customer devam ederek adlı IncomingOrdersbir veri kaynağı olduğunu ve büyük OrderSizeolan her sipariş için bu sırayı temel alan yeni Customer bir oluşturmak istediğinizi varsayalım. LinQ sorgusu bu veri kaynağında yürütülebilir ve bir koleksiyonu doldurmak için nesne başlatmayı kullanabilir:

var newLargeOrderCustomers = from o in IncomingOrders
                            where o.OrderSize > 5
                            select new Customer { Name = o.Name, Phone = o.Phone };

Veri kaynağı, gibi OrderSizesınıfından Customer daha fazla özelliğe sahip olabilir, ancak nesne başlatma ile sorgudan döndürülen veriler istenen veri türüne kalıplanır; sınıfınızla ilgili verileri seçersiniz. Sonuç olarak, artık istediğiniz yenilerle Customerdoldurulmuş olursunuzSystem.Collections.Generic.IEnumerable<T>. Yukarıdaki örnek LINQ yönteminin söz diziminde de yazılabilir:

var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });

C# 12 ile başlayarak, bir koleksiyonu başlatmak için bir koleksiyon ifadesi kullanabilirsiniz.

Daha fazla bilgi için bkz.

Anonim Türler

Derleyici anonim bir tür oluşturur. Tür adı yalnızca derleyici tarafından kullanılabilir. Anonim türler, ayrı bir adlandırılmış tür tanımlamak zorunda kalmadan sorgu sonucunda bir özellik kümesini geçici olarak gruplandırmak için kullanışlı bir yol sağlar. Anonim türler, burada gösterildiği gibi yeni bir ifade ve nesne başlatıcı ile başlatılır:

select new {name = cust.Name, phone = cust.Phone};

C# 7 ile başlayarak, adsız türler oluşturmak için tanımlama kümeleri kullanabilirsiniz.

Uzantı Metotları

Uzantı yöntemi bir türle ilişkilendirilebilen statik bir yöntemdir, böylece türdeki bir örnek yöntemiymiş gibi çağrılabilir. Bu özellik, mevcut türlerde değişiklik yapmadan yeni yöntemleri "eklemenizi" sağlar. Standart sorgu işleçleri, uygulayan her tür için LINQ sorgu işlevselliği sağlayan bir uzantı yöntemleri kümesidir IEnumerable<T>.

Lambda İfadeleri

Lambda ifadeleri, giriş parametrelerini işlev gövdesinden ayırmak için işlecini => kullanan ve derleme zamanında temsilciye veya ifade ağacına dönüştürülebilen bir satır içi işlevdir. LINQ programlamada, standart sorgu işleçlerine doğrudan yöntem çağrıları yaptığınızda lambda ifadeleriyle karşılaşırsınız.

Veri olarak ifadeler

Sorgu nesneleri birleştirilebilir, yani bir yöntemden sorgu döndürebilirsiniz. Sorguları temsil eden nesneler, sonuçta elde edilen koleksiyonu değil, gerektiğinde sonuçları üretme adımlarını depolar. Yöntemlerden sorgu nesnelerini döndürmenin avantajı, daha fazla oluşturulabilmesi veya değiştirilmeleridir. Bu nedenle, sorgu döndüren bir yöntemin herhangi bir dönüş değeri veya out parametresi de bu türe sahip olmalıdır. Bir yöntem sorguyu somut List<T> bir türe veya Array türe dönüştürüyorsa, sorgunun kendisi yerine sorgu sonuçlarını döndürür. Bir yöntemden döndürülen sorgu değişkeni yine de oluşturulabilir veya değiştirilebilir.

Aşağıdaki örnekte, ilk yöntem QueryMethod1 bir sorguyu dönüş değeri olarak, ikinci yöntem QueryMethod2 ise bir sorguyu parametre olarak out döndürür (returnQ örnekte). Her iki durumda da, sorgu sonuçları değil döndürülen bir sorgudur.

IEnumerable<string> QueryMethod1(int[] ints) =>
    from i in ints
    where i > 4
    select i.ToString();

void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
    returnQ =
        from i in ints
        where i < 4
        select i.ToString();

int[] nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

var myQuery1 = QueryMethod1(nums);

Sorgu myQuery1 aşağıdaki foreach döngüsünde yürütülür.

foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}

Türünü görmek için fare işaretçisini üzerine myQuery1 getirin.

Ayrıca, komutunu kullanmadan myQuery1doğrudan öğesinden QueryMethod1 döndürülen sorguyu yürütebilirsiniz.

foreach (var s in QueryMethod1(nums))
{
    Console.WriteLine(s);
}

Dönüş türünü görmek için QueryMethod1 fare işaretçisini çağrının üzerinde bekletin.

QueryMethod2 parametresinin out değeri olarak bir sorgu döndürür:

QueryMethod2(nums, out IEnumerable<string> myQuery2);

// Execute the returned query.
foreach (var s in myQuery2)
{
    Console.WriteLine(s);
}

Sorgu oluşturma kullanarak bir sorguyu değiştirebilirsiniz. Bu durumda, yeni bir sorgu nesnesi oluşturmak için önceki sorgu nesnesi kullanılır. Bu yeni nesne, özgün sorgu nesnesinden farklı sonuçlar döndürür.

myQuery1 =
    from item in myQuery1
    orderby item descending
    select item;

// Execute the modified query.
Console.WriteLine("\nResults of executing modified myQuery1:");
foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}