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 kullanılarak varörtük olarak yazıldığında ne olduğunu anlayacaksınız.

LINQ sorgu işlemleri veri kaynağına, sorgunun kendisine ve sorgu yürütmeye kesin olarak yazılı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, kullanarak varörtük yazma 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.

Diagram that shows the relation of data types in a LINQ query.

  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 deyiminde foreach 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.

Diagram showing a query that transforms the data type.

  1. Veri kaynağının tür bağımsız değişkeni, aralık değişkeninin türünü belirler.
  2. deyimi, select tam Customer nesne yerine özelliğini döndürürName. Bir Name dize olduğundan, türündeki bağımsız değişkeni custNameQuerystringdeğildir Customer.
  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.

Diagram showing a more complex query that transforms the data type.

  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 kullanılarak varö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.

Diagram that shows the type flow with implicit typing.

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 listesi olarak List<string>, nesne listesi Customer ise olarak List<Customer>ifade edilir. Genel bir liste kesin olarak yazılır ve öğelerini olarak Objectdepolayan koleksiyonlara göre birçok avantaj sağlar. 'a List<string>eklemeye Customer ç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> , genel koleksiyon sınıflarının deyimi kullanılarak numaralanmasını sağlayan arabirimdir foreach . Genel koleksiyon sınıfları, IEnumerable<T> destek gibi genel olmayan koleksiyon sınıfları gibi ArrayList destekler IEnumerable.

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 olarak IEnumerable<T> veya gibi türetilmiş bir türe IQueryable<T>dönüştürü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 yan tümcesinde belirtilen veri kaynağına bakarak sorgu değişkeninin türünü çıkarmasını from bildirir. 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, kullanıyorsanız varkodunuzun başkalarının okumasını zorlaştırabileceğini fark etmelerini öneririz. Daha fazla bilgi için bkz . Örtük Olarak Yazılan Yerel Değişkenler.