Aracılığıyla paylaş


LINQ Sorgu İşlemlerinde Tür İlişkileri (C#)

Sorguları etkili bir şekilde yazmak için, eksiksiz bir sorgu işlemindeki değişken türlerinin birbiriyle nasıl ilişkili olduğunu anlamanız gerekir. Bu ilişkileri anlarsanız, belgelerdeki LINQ örneklerini ve kod örneklerini daha kolay anlayabilirsiniz. Ayrıca, değişkenler var kullanılarak örtük olarak yazıldığında ne olduğunu anlayacaksınız.

LINQ sorgu işlemleri, veri kaynağında, sorgunun kendisinde ve sorgunun yürütülmesinde kesin tür tanımlıdır. Sorgudaki değişkenlerin türü, veri kaynağındaki öğelerin türüyle ve deyimindeki yineleme değişkeninin foreach türüyle uyumlu olmalıdır. Bu güçlü yazma, tür hatalarının, kullanıcılar karşılaşmadan önce düzeltilebildiği derleme zamanında yakalanmalarını garanti eder.

Bu tür ilişkilerini göstermek için, izleyen örneklerin çoğu tüm değişkenler için açık yazma kullanır. Son örnek, var kullanarak örtük tür belirtme kullandığınızda bile aynı ilkelerin nasıl uygulandığını gösterir.

Kaynak Verileri Dönüştürmeyen Sorgular

Aşağıdaki çizimde, verilerde dönüştürme gerçekleştirmeden LINQ to Objects sorgu işlemi gösterilmektedir. Kaynak bir dizi dize içerir ve sorgu çıkışı da bir dizi dizedir.

LINQ sorgusundaki veri türlerinin ilişkisini gösteren diyagram.

  1. Veri kaynağının tür bağımsız değişkeni, aralık değişkeninin türünü belirler.
  2. Seçilen nesnenin türü, sorgu değişkeninin türünü belirler. Burada name bir dize yer alır. Bu nedenle, sorgu değişkeni bir IEnumerable<string>'dir.
  3. Sorgu değişkeni foreach ifadesi üzerinde yinelenir. Sorgu değişkeni bir dizi dize olduğundan, yineleme değişkeni de bir dizedir.

Kaynak Verileri Dönüştüren Sorgular

Aşağıdaki çizimde, veriler üzerinde basit bir dönüştürme gerçekleştiren LINQ to SQL sorgu işlemi gösterilmektedir. Sorgu, giriş olarak bir nesne dizisi Customer alır ve sonuçta yalnızca Name özelliği seçer. Bir Name dize olduğundan, sorgu çıkış olarak bir dizi dize oluşturur.

Veri türünü dönüştüren bir sorguyu gösteren diyagram.

  1. Veri kaynağının tür bağımsız değişkeni, aralık değişkeninin türünü belirler.
  2. select deyimi, tam Name nesne yerine Customer özelliğini döndürür. Name bir dize olduğundan, custNameQuery'nin tür bağımsız değişkeni string'dir, Customer değil.
  3. Dize custNameQuery dizisi olduğundan, döngünün foreach yineleme değişkeni de bir stringolmalıdır.

Aşağıdaki çizimde biraz daha karmaşık bir dönüşüm gösterilmektedir. deyimi, select özgün Customer nesnenin yalnızca iki üyesini yakalayan anonim bir tür döndürür.

Veri türünü dönüştüren daha karmaşık bir sorguyu gösteren diyagram.

  1. Veri kaynağının tür bağımsız değişkeni her zaman sorgudaki aralık değişkeninin türüdür.
  2. select deyimi anonim bir tür oluşturduğundan, sorgu değişkeni var kullanılarak örtük olarak yazılmalıdır.
  3. Sorgu değişkeninin türü örtük olduğundan, döngüdeki foreach yineleme değişkeni de örtük olmalıdır.

Derleyicinin tür bilgilerini çıkarmasına izin verme

Bir sorgu işlemindeki tür ilişkilerini anlamanız gerekir, ancak derleyicinin tüm işleri sizin yerine yapmasına izin verme seçeneğiniz vardır. var anahtar sözcüğü, sorgu işlemindeki herhangi bir yerel değişken için kullanılabilir. Aşağıdaki çizim, daha önce açıklanan 2 numaralı örneğe benzer. Ancak, derleyici sorgu işlemindeki her değişken için güçlü türü sağlar.

Örtük tür tanımlama ile tür akışını gösteren diyagram.

LINQ ve genel türler (C#)

LINQ sorguları genel türleri temel alır. Sorgu yazmaya başlamadan önce genel bilgiler hakkında ayrıntılı bilgiye ihtiyacınız yoktur. Ancak, iki temel kavramı anlamak isteyebilirsiniz:

  1. gibi List<T>genel bir koleksiyon sınıfının örneğini oluşturduğunuzda, "T"yi listenin barındıracağı nesne türüyle değiştirirsiniz. Örneğin, dizelerin bir listesi olarak List<string> ifade edilir, ve nesne listesi olarak Customer ifade edilir List<Customer>. Genel bir liste kesin olarak yazılır ve öğelerini olarak Objectdepolayan koleksiyonlara göre birçok avantaj sağlar. Customer eklemeye List<string> çalışırsanız, derleme zamanında bir hata alırsınız. Çalışma zamanı tür ataması yapmanız gerekmediğinden genel koleksiyonları kullanmak kolaydır.
  2. IEnumerable<T> adı verilen arabirim, foreach deyimi kullanılarak genel koleksiyon sınıflarının numaralandırılmasını sağlar. Genel koleksiyon sınıfları, IEnumerable<T> desteklerken, tıpkı genel olmayan koleksiyon sınıflarının ArrayList desteklemesi gibi, IEnumerable destekler.

Genel değerler hakkında daha fazla bilgi için bkz. Genel değerler.

LINQ sorgularında IEnumerable<T> değişkenleri

LINQ sorgu değişkenleri IEnumerable<T> veya türetilmiş bir tür olan IQueryable<T> olarak yazılır. olarak IEnumerable<Customer>yazılan bir sorgu değişkeni gördüğünüzde bu, sorgu yürütülürken sıfır veya daha fazla Customer nesne dizisi oluşturacağı anlamına gelir.

IEnumerable<Customer> customerQuery = from cust in customers
                                      where cust.City == "London"
                                      select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}

Derleyicinin genel tür bildirimlerini işlemesine izin verme

İsterseniz , var anahtar sözcüğünü kullanarak genel söz dizimini önleyebilirsiniz. var anahtar sözcüğü, derleyiciye from yan tümcesinde belirtilen veri kaynağına bakarak sorgu değişkeninin türünü çıkarması talimatını verir. Aşağıdaki örnek, önceki örnekle aynı derlenmiş kodu oluşturur:

var customerQuery2 = from cust in customers
                     where cust.City == "London"
                     select cust;

foreach(var customer in customerQuery2)
{
    Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}

var anahtar sözcüğü, değişkenin türü belirgin olduğunda veya grup sorguları tarafından oluşturulanlar gibi iç içe genel türleri açıkça belirtmek önemli olmadığında yararlıdır. Genel olarak, var kullanıyorsanız, kodunuzun başkaları tarafından okunmasını zorlaştırabileceğini fark etmenizi öneririz. Daha fazla bilgi için Örtük Olarak Yazılan Yerel Değişkenler bölümüne bakın.