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.
- Veri kaynağının tür bağımsız değişkeni, aralık değişkeninin türünü belirler.
- 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 birIEnumerable<string>
'dir. - 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.
- Veri kaynağının tür bağımsız değişkeni, aralık değişkeninin türünü belirler.
- deyimi,
select
tamCustomer
nesne yerine özelliğini döndürürName
. BirName
dize olduğundan, türündeki bağımsız değişkenicustNameQuery
string
değildirCustomer
. - Dize
custNameQuery
dizisi olduğundan, döngününforeach
yineleme değişkeni de birstring
olmalı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 kaynağının tür bağımsız değişkeni her zaman sorgudaki aralık değişkeninin türüdür.
select
deyimi anonim bir tür oluşturduğundan, sorgu değişkeni kullanılarakvar
örtük olarak yazılmalıdır.- 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.
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:
- 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 listesiCustomer
ise olarakList<Customer>
ifade edilir. Genel bir liste kesin olarak yazılır ve öğelerini olarak Objectdepolayan koleksiyonlara göre birçok avantaj sağlar. 'aList<string>
eklemeyeCustomer
ç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. - 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 var
kodunuzun 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.