Aracılığıyla paylaş


Dil Tümleşik Sorgusu (LINQ)

Language-Integrated Sorgusu (LINQ), sorgu özelliklerinin doğrudan C# diliyle tümleştirilmesine dayalı bir dizi teknolojinin adıdır. Geleneksel olarak, verilere yönelik sorgular derleme zamanında veya IntelliSense desteğinde tür denetimi yapılmadan basit dizeler olarak ifade edilir. Ayrıca, her veri kaynağı türü için farklı bir sorgu dili öğrenmeniz gerekir: SQL veritabanları, XML belgeleri, çeşitli Web hizmetleri vb. LINQ ile sorgu sınıflar, yöntemler ve olaylar gibi birinci sınıf bir dil yapısıdır.

Sorgu yazdığınızda, LINQ'in en görünür "dille tümleştirilmiş" bölümü sorgu ifadesidir. Sorgu ifadeleri bildirim temelli bir sorgu söz diziminde yazılır. Sorgu söz dizimini kullanarak, veri kaynaklarında en az kodla filtreleme, sıralama ve gruplandırma işlemleri gerçekleştirirsiniz. Her tür veri kaynağından verileri sorgulamak ve dönüştürmek için aynı sorgu ifadesi desenlerini kullanırsınız.

Aşağıdaki örnekte eksiksiz bir sorgu işlemi gösterilmektedir. Tam işlem bir veri kaynağı oluşturmayı, sorgu ifadesini tanımlamayı ve sorguyu bir foreach deyimde yürütmeyi içerir.

// Specify the data source.
int[] scores = [97, 92, 81, 60];

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (var i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

Yukarıdaki örneğin derlenmesi için bir using yönergesi using System.Linq;eklemeniz gerekebilir. .NET'in en son sürümleri, bu yönergeyi küresel kullanım olarak eklemek için gizli kullanımlarıkullanır. Eski sürümler, kaynağınıza eklemenizi gerektirir.

Sorgu ifadelerine genel bakış

  • Sorgu ifadeleri, LINQ özellikli herhangi bir veri kaynağından verileri sorgular ve dönüştürür. Örneğin, tek bir sorgu SQL veritabanından veri alabilir ve çıkış olarak bir XML akışı oluşturabilir.
  • Sorgu ifadeleri, okunmasını kolaylaştıran birçok tanıdık C# dil yapısı kullanır.
  • Sorgu ifadesindeki değişkenlerin tümü güçlü bir şekilde tiplendirilmiştir.
  • Sorgu, sorgu değişkenini yineleyene kadar gerçekleştirilmez; örneğin, bir foreach deyimde.
  • Derleme zamanında sorgu ifadeleri, C# belirtiminde tanımlanan kurallara göre standart sorgu işleci yöntemi çağrılarına dönüştürülür. Sorgu söz dizimi kullanılarak ifade edilebilen tüm sorgular, yöntem söz dizimi kullanılarak da ifade edilebilir. Bazı durumlarda sorgu söz dizimi daha okunabilir ve kısadır. Diğerlerinde yöntem söz dizimi daha okunabilir. İki farklı form arasında anlamsal veya performans farkı yoktur. Daha fazla bilgi için bkz. C# dil belirtimi ve Standart sorgu işleçlerine genel bakış.
  • Count veya Max gibi bazı sorgu işlemlerinin eşdeğer sorgu ifade yan cümleleri yoktur ve bu nedenle yöntem çağrısı olarak ifade edilmelidir. Yöntem söz dizimi, çeşitli yollarla sorgu söz dizimi ile birleştirilebilir.
  • Sorgu ifadeleri, sorgunun uygulandığı türe bağlı olarak ifade ağaçlarına veya delegeye derlenebilir. IEnumerable<T> sorgular temsilciler için derlenir. IQueryable ve IQueryable<T> sorgular ifade ağaçlarına derlenir. Daha fazla bilgi için bkz. İfade ağaçları.

Veri kaynağınızın LINQ sorgusunu etkinleştirme

Bellek içi veriler

Bellek içi verilerin LINQ sorgusunu etkinleştirmenin iki yolu vardır. Verileriniz IEnumerable<T>'yi uygulayan bir türdeyse, LINQ to Objects kullanarak sorgulayabilirsiniz. Arabirimini uygulayarak IEnumerable<T> numaralandırmayı etkinleştirmek mantıklı değilse, LINQ standart sorgu işleci yöntemlerini bu türde veya bu tür için uzantı yöntemleri olarak tanımlamak gerekir. Standart sorgu işleçlerinin özel uygulamaları, sonuçları döndürmek için ertelenmiş yürütme kullanmalıdır.

Uzak veriler

Uzak veri kaynağının LINQ sorgulamasını etkinleştirmek için en iyi seçenek arabirimi uygulamaktır IQueryable<T> .

IQueryable LINQ sağlayıcıları

Uygulayan IQueryable<T> LINQ sağlayıcıları karmaşıklıklarında büyük ölçüde farklılık gösterebilir.

Daha az karmaşık IQueryable bir sağlayıcı bir Web hizmetinden tek bir yönteme erişebilir. İşlediği sorgularda belirli bilgiler beklediğinden bu tür sağlayıcı çok özeldir. Belki de tek bir sonuç türünü ortaya çıkarmak için kapalı bir tür sistemine sahiptir. Sorgunun yürütülmesinin çoğu, örneğin standart sorgu işleçlerinin uygulamaları kullanılarak Enumerable yerel olarak gerçekleşir. Daha az karmaşık bir sağlayıcı, ifade ağacında sorguyu temsil eden tek bir yöntem çağrısı ifadesini inceleyebilir ve sorgunun kalan mantığının başka bir yerde işlenmesine izin verebilir.

Orta IQueryable düzeyde karmaşıklık düzeyine sahip bir sağlayıcı, kısmen ifade eden sorgu diline sahip bir veri kaynağını hedef alabilir. Bir Web hizmetini hedeflerse, Web hizmetinin birden fazla yöntemine erişebilir ve sorgunun aradığı bilgilere göre hangi yöntemin çağrılabileceğini seçebilir. Orta karmaşıklıkta bir sağlayıcı, basit bir sağlayıcıdan daha zengin bir tür sistemine sahip olabilir, ancak yine de sabit bir tür sistemi olacaktır. Örneğin sağlayıcı, çapraz geçirilebilen bire çok ilişkileri olan türleri kullanıma sunabilir, ancak kullanıcı tanımlı türler için eşleme teknolojisi sağlamaz.

IQueryable sağlayıcısı gibi karmaşık bir sağlayıcı, TAM LINQ sorgularını SQL gibi ifade edici bir sorgu diline çevirebilir. Karmaşık bir sağlayıcı daha geneldir çünkü sorguda daha çeşitli soruları işleyebilir. Ayrıca açık tür sistemine sahiptir ve bu nedenle kullanıcı tanımlı türleri eşlemek için kapsamlı bir altyapı içermelidir. Karmaşık bir sağlayıcı geliştirmek için önemli miktarda çaba gerekir.