LINQ nedir ve ne işe yarar? [kapalı]


126

LINQ nedir? Veritabanları için olduğunu biliyorum ama ne işe yarıyor?


20
"Makul bir şekilde cevaplanamaz" kriterini yendiğime inanıyorum. Bu sorunun kapatılması için hiçbir sebep yok.
Amy B

Yanıtlar:


171

LINQ , Dil Tümleşik Sorgu anlamına gelir .

YAQL (Bir Başka Sorgu Dili) yazmak yerine, Microsoft dil geliştiricileri, sorguları doğrudan kendi dillerinde (C # ve Visual Basic gibi) ifade etmenin bir yolunu sağladı. Bu sorguları oluşturmaya yönelik teknikler, sorgulanan şeyin uygulama ayrıntılarına dayanmaz, böylece birçok hedefe (veritabanları, bellek içi nesneler, XML) karşı geçerli sorgular yazabilmeniz için, temelde yatan yolu neredeyse hiç dikkate almadan yazabilirsiniz. sorgu yürütülecektir.

Bu araştırmaya .NET Framework (3.5) 'e ait parçalarla başlayalım.

  • LINQ To Objects - sorgu yöntemleri için System.Linq.Enumerable'ı inceleyin . Bu hedef IEnumerable<T>, her türden döngü oluşturabilen koleksiyonun tür açısından güvenli bir şekilde sorgulanmasına olanak tanır. Bu sorgular, İfadeler yerine derlenmiş .NET yöntemlerine dayanır.

  • LINQ To Anything - bazı sorgu yöntemleri için System.Linq.Queryable'ı inceleyin . Bu hedef IQueryable<T>, alttaki uygulama ile tercüme edilebilen İfade Ağaçlarının inşasına izin verir.

  • İfade Ağaçları - System.Linq.Expressions ad alanını inceleyin . Bu veri olarak koddur. Pratikte, bu şeylerin farkında olmalısınız, ancak bu türlere karşı kod yazmanıza gerçekten gerek yok. Dil özellikleri (lambda ifadeleri gibi), bu türlerle doğrudan uğraşmaktan kaçınmak için çeşitli kısa eller kullanmanıza izin verebilir.

  • LINQ To SQL - System.Data.Linq ad alanını inceleyin . Özellikle DataContext. Bu, C # ekibi tarafından oluşturulmuş bir DataAccess teknolojisidir. Sadece çalışıyor.

  • LINQ To Entities - System.Data.Objects ad alanını inceleyin . Özellikle ObjectContext. Bu, ADO.NET ekibi tarafından oluşturulmuş bir DataAccess teknolojisidir. LINQ To SQL'den daha karmaşık, güçlü ve kullanımı daha zordur.

  • LINQ To XML - System.Xml.Linq ad alanını inceleyin . Esasen, insanlar içindeki şeylerden memnun değildi System.Xml. Bu nedenle Microsoft bunu yeniden yazdı ve LINQ To Objects'i XML'e karşı kullanmayı kolaylaştıran bazı yöntemleri tanıtmak için yeniden yazma avantajından yararlandı.

  • Func ve Action gibi bazı güzel yardımcı türleri . Bu türler, Genel Destekli temsilcilerdir. Kendi özel (ve değiştirilemez) temsilci türlerinizi ilan ettiğiniz günler geride kaldı.

Yukarıdakilerin tümü .NET Framework'ün bir parçasıdır ve herhangi bir .NET dilinden (VB.NET, C #, IronPython, COBOL .NET vb.)


Tamam, dil özelliklerine gelelim. C # 'a sadık kalacağım, çünkü en iyi bildiğim şey bu. VB.NET ayrıca birkaç benzer iyileştirmeye de sahipti (ve C # 'ın almadığı bir çift - XML ​​değişmezleri). Bu kısa ve eksik bir listedir.

  • Uzantı Yöntemleri - bu, yazmak için bir yöntem "eklemenize" olanak tanır. Yöntem, türün bir örneğini geçiren ve türün genel sözleşmesi ile sınırlandırılan statik bir yöntemdir, ancak kontrol etmediğiniz türlere (dize) veya eklemeye (tamamen uygulanmış) yöntemler eklemek için çok kullanışlıdır. ) arabirimlere yardımcı yöntemler.

  • Sorgu Anlama Sözdizimi - bu, SQL benzeri bir yapıda yazmanıza olanak tanır. Tüm bu şeyler System.Linq.Queryable veya System.Linq.Enumerable'daki yöntemlere çevrilir (myCustomers'ın Türüne bağlı olarak). Tamamen isteğe bağlıdır ve LINQ olmadan da kullanabilirsiniz. Bu sorgu bildirim tarzının bir avantajı, aralık değişkenlerinin kapsamlı olmasıdır: her cümle için yeniden bildirilmelerine gerek yoktur.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Lambda İfadeleri - Bu, bir yöntem belirtmenin kısaltmasıdır. C # derleyicisi her birini anonim bir yönteme veya bir true System.Linq.Expressions.Expression. Linq'i iyi kullanmak için bunları gerçekten anlamanız gerekiyor. Üç bölüm vardır: bir parametre listesi, bir ok ve bir yöntem gövdesi.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • Anonim Türler - Bazen derleyici sizin için bir tür oluşturmak için yeterli bilgiye sahiptir. Bu türler gerçekten anonim değildir: derleyici onları oluşturduğunda adlandırır. Ancak bu isimler, bir geliştiricinin tasarım zamanında bu adı kullanması için çok geç olan derleme zamanında yapılır.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • Örtülü Türler - Bazen derleyici, başlatmadan itibaren türü sizin için bulabilecek kadar yeterli bilgiye sahiptir. Var anahtar sözcüğünü kullanarak derleyiciye bunu yapması için talimat verebilirsiniz. Programcılar anonim bir türün adını kullanamayabileceğinden, Anonim Türler için değişkenleri bildirmek için örtük yazım gerekir .

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);

14

LINQ (Dil Entegre Sorgusu) şunlara atıfta bulunabilir:

  • bağımsız değişken olarak daha yüksek dereceli işlevleri kapsamlı şekilde kullanan bir koleksiyon ve yineleyici manipülasyon kitaplığı (System.Linq)

  • soyut sözdizimi ağaçları (System.Linq.Expressions) olarak basit işlevlerin iletilmesi ve işlenmesi için bir kitaplık

  • Koleksiyonları işlemek için daha SQL benzeri bir sözdizimi sağlamak için çeşitli dillerde bir sözdizimi uzantısı, anonim işlevler için daha kompakt bir gösterim ve son üye işlevlerden sözdizimsel olarak ayırt edilemeyen statik yardımcı işlevler sunmak için bir mekanizma

  • Sorgu yapısını almak ve potansiyel olarak optimizasyon gerçekleştirmek için veri sağlayıcılarının uyabileceği bir arayüz tanımı veya bazen uyumlu veri sağlayıcıların kendileri

Bileşenler tek başına veya birleşik olarak kullanılabilir.



6

Basit bir cevap bulmaya çalışacağım: LINQ, SQL'e benzer ancak bir .NET uygulaması içinde derlenebilen bir sorgu dili kullanarak veritabanınızı (veya diğer veri deposunu, XML vb.) Sorgulamanın bir yoludur.


1
Peki, Linq ve SQL arasındaki fark tam olarak nedir?
Kredns

Bence bunun daha karmaşık bir adı var ama yapılar farklı: SQL Select From Where ve LINQ is From Where Select. LINQ ile döngü kurmak daha kolaydır. LINQ daha kolaydır :) ve ürettiği SQL, zaman tasarrufu düşünüldüğünde genellikle yeterince iyidir.
jcollum

2
dürüst olmak gerekirse, SQL'in şu şekilde yazılması gerektiği tartışılabilir From Where Select, etc.- yani Sonuç Kümesinin gerçekte oluşturulduğu şekilde yazılmalıdır
Don Cheadle

6

LINQ, Dil Tümleşik Sorgu anlamına gelir ve CLR'de genel amaçlı bir "sorgulama" mekanizması sağlamanın bir yoludur.

En temel düzeyde, bu, IEnumerable <T> üzerinde bir dizi yöntemden oluşur - ör., Seç, Topla, Nerede - kısıtlamalar, projeksiyonlar vb. İçin kullanılabilir. [1]

Biraz daha ileri götürmek için LINQ, bir ifade ağacını alabilen ve bunu CLR dışındaki bir veri kaynağına karşı "yerel" sorgular çalıştırmak için kullanabilen yeni bir LINQ sağlayıcı modelini de tanımlar - örneğin, LINQ to SQL, LINQ to XML, LINQ NHibernate, vb.

C # ve VB.NET ayrıca, derleyicinin daha sonra eşdeğer IEnumerable <T> çağrılarına çevirdiği, satır içi (SQL'e çok benzeyen) güçlü yazılmış sorgular yazmanıza izin veren bir sorgu sözdizimi tanımlamıştır.

Bana göre, LINQ ile ilgili en ilginç şey, onu desteklemek için gerekli olan tüm C # ve VB.NET özelliklerinin kendi başlarına yararlı olmasıdır. Uzantı yöntemleri, anonim türler, lambda ifadeleri ve örtük yazmanın tümü LINQ'yu desteklemek için gerekliydi - ancak bu özellikleri saf LINQ bağlamının dışında kullanma eğilimindeyiz.

[1] Bunlar ilişkisel terimlerdir, işlevsel programcılar muhtemelen Harita, Küçült, Katla vb. Tercih eder.


5

LINQ, C # programlama dilinden türetilmiş bir deyim kullanarak veri ayıklamak için bir teknolojidir. İşlevsel tasarım açısından SQL'e çok şey borçlu olsa da, temelde kendi veri sorgulama dilidir. Geniş bir veri kaynakları yelpazesinde (SQL veritabanları, bellek içi gösterimler, XML, vb.) Çalışır. Özellikle LINQ-To-SQL, SQL programlama ve C # / VB programlama arasında sıklıkla "empedans uyuşmazlığı" olarak adlandırılan durumdan muzdarip gömülü SQL'in geleneksel kullanımının bir zıtlığı olarak görülmelidir.

LINQ ve sınırlamaları hakkında bir tartışma için, bu ilgili soruya bir göz atmak isteyebilirsiniz: LINQ to SQL asıl noktayı kaçırmıyor mu?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"LINQ Projesi, .NET Framework'e yönelik, dille tümleşik sorgu, ayarlama ve dönüştürme işlemlerini kapsayan bir dizi uzantı için bir kod adıdır. Sorgular için yerel dil sözdizimi ile C # ve Visual Basic'i genişletir ve avantajlarından yararlanmak için sınıf kitaplıkları sağlar bu yetenekler. "


Yani veritabanları için mi? Burada (SO'da) gördüğüm şey daha çok .net ortamındaki koleksiyonlara benziyor.
OscarRyz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.