"LINQ to Entities", "LINQ to SQL" ve "LINQ to Dataset" arasındaki fark nedir


93

Uzun süredir LINQ ile çalışıyorum. Bununla birlikte, LINQ'nun bahsedilen lezzetleri arasındaki gerçek farklılıkların ne olduğu biraz gizemini korumaktadır.

Başarılı cevap, aralarında kısa bir ayrım içerecektir. Her lezzetin ana amacı nedir, faydası nedir ve performans etkisi var mı?

Not: Dışarıda pek çok bilgi kaynağı olduğunu biliyorum, ancak yeni başlayanlara belirli bir hedef için nereye gideceklerini bildiren bir tür "kopya kağıdı" arıyorum.


Yanıtlar:


112
  • hepsi LINQ - Dil Tümleşik Sorgu - bu yüzden hepsi birçok ortak noktayı paylaşıyor. Tüm bu "lehçeler", temel olarak, çeşitli kaynaklardan, sorgu tarzı bir veri seçimi yapmanızı sağlar.

  • Linq-SQL , Microsoft'un ORM - Object-Relational Mapper'daki ilk girişimidir. Yalnızca SQL Server'ı destekler. SQL Server veritabanı tablolarını .NET nesnelerine eşlemek için kullanılan bir eşleme teknolojisidir.

  • Linq-to-Entities aynı fikirdir, ancak arka planda ORM olarak Entity Framework kullanmak - yine Microsoft'tan, ancak birden çok veritabanı arka ucunu destekler

  • Linq-to-DataSets , LINQ'dur, ancak kullanımı "eski tarz" ADO.NET 2.0 DataSets'e aykırıdır - Microsoft'tan ORM'lerden önceki zamanlarda, ADO.NET ile yapabileceğiniz tek şey DataSets, DataTables vb. Ve Linq döndürmekti. -to-DataSets bu veri depolarını veri için sorgular. Bu durumda, bir veritabanı arka ucundan bir DataTable veya DataSets (System.Data ad alanı) döndürür ve ardından LINQ sözdizimini kullananları sorgularsınız.


1
50k için tebrikler, artık resmi olarak StackOverflow'da çok fazla zaman harcadınız. ;)
Aaronaught

1
@Aaronaught: teşekkürler - ve kesinlikle haklısınız! :-) Her erkeğe bir bağımlılık bırakmalı , değil mi? Lütfen?!?!?!
marc_s

1
marc_s, bu cevap için teşekkürler. Performans hakkında bir şeyler söyleyebilir misin? Cevabınızdan, Linq-to-Entities'in en gelişmiş olduğunu ve bu nedenle muhtemelen en çok performans gösteren olduğunu tahmin ediyorum.
Marcel

2
@Marcel: Bağırsaklarımdan (kesin gerçekler yok), şunu söyleyebilirim: Linq-SQL veya en hızlısı (veritabanı ve nesne modeli arasında yalnızca bir katman), Linq-to-Dataset yakın bir saniye ve Linq-to -Entities sondur, çünkü Entity Framework her zaman iki eşleme katmanına sahiptir (dolayısıyla en karmaşık olanıdır). Ama yine: sadece içgüdüsel bir his, bunu destekleyecek rakam yok
marc_s

3
@marc_s Bunun eski bir gönderi olduğunu biliyorum, ancak LINQ to Entities, çoğu durumda LINQ to Dataset'ten daha hızlı olacaktır. LINQ to Dataset gerçekten bir tür değil, nesne olarak veri kümesini kullandığınız LINQ over Objects. LINQ over objects herhangi bir SQL yapmadığından, önce Veri Kümenizi SQL kaynağından oluşturmanız gerekir ve nesneler üzerinden LINQ, verileri veri kümesine alma konusunda herhangi bir sorgu optimizasyonu gerçekleştirmenize yardımcı olamaz. Bu ve veri kümeleri performans açısından korkunç çünkü tüm sütunlar kutu içine alınmış ve tüm bu tür değişimler performansı düşürüyor.
Robert McKee

38

LINQ, (örneğin) bir sorgu anlama sözdizimini temel alan geniş bir teknoloji kümesidir, örneğin:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

derleyici tarafından koda eşlenen:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

ve burada gerçek sihir başlıyor. FooBurada ne olduğunu söylemediğimizi ve derleyicinin umursamadığını unutmayın! Kadar zaman çözebilirsiniz Olarak bazı adlandırılan uygun yöntem Wherebir lambda alabilir ve bunun sonucu olan bazı Select lambda kabul edebilir yöntemi, bu mutlu.

Şimdi lambda derlenebilir olduğunu düşünün ya , (to-DataSet'in Entities-içeren LINQ nesneleri için, temsilci) anonim bir yönteme veya bir nesne modeli lambda temsil eden bir ifade ağacı için (çalışma zamanı modeli ).

Bellek içi veriler için (tipik olarak IEnumerable<T>), sadece delegeyi iyi ve hızlı bir şekilde yürütür. Ancak IQueryable<T>(a LambdaExpression<...>) ifadesinin nesne temsili için onu ayırabilir ve herhangi bir "LINQ-to-Something" örneğine uygulayabilir.

Veritabanları için (LINQ-to-SQL, LINQ-to-Entities) bu, TSQL yazmak anlamına gelebilir, örneğin:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

Ancak (örneğin ADO.NET Veri Hizmetleri için) bir HTTP sorgusu yazmak anlamına gelebilir.

Az miktarda veri döndüren iyi yazılmış bir TSQL sorgusu yürütmek, tüm veritabanını ağ üzerinden yüklemekten ve ardından istemcide filtrelemekten daha hızlıdır. Her ikisinin de ideal senaryoları ve tamamen yanlış senaryoları var.

Buradaki amaç ve fayda, çok çeşitli veri kaynaklarını sorgulamak için statik olarak kontrol edilen tek bir sözdizimi kullanmanıza olanak sağlamak ve kodu daha anlamlı hale getirmektir (örneğin, verileri gruplamak için "geleneksel" kod, ne yapmaya çalıştığı açısından çok açık - kod kütlesinde kaybolur).


Marc, bu görüş için teşekkürler. Ancak bu kadar detaylı iç kısımları sormadım. -1, üzgünüm çünkü soruyu cevaplamıyor.
Marcel

7
Kendi LINQ sağlayıcısını yazan biri olarak, şu ana kadar gördüğüm en iyi cevap bu. -1 konusunda katılmıyorum.
Dan Barowy

30

LINQ, dil ile entegre sorgu anlamına gelir. Veri kaynaklarından bilgi ayıklamak için "SQL stili" sorgu dilini doğrudan C # içinde kullanmanıza izin verir.

  • Bu veri kaynağı bir SQL sunucusu veritabanı olabilir - bu Linq to SQL'dir
  • Bu veri kaynağı, varlık çerçeve nesnelerinin bir veri bağlamı olabilir - varlıklara Linq .
  • - Bu veri kaynağı ADO.net veri setleri olabilir DataSet Linq .

Bu veri kaynağı bir XML dosyası da olabilir - Linq to XML .
Ya da sadece düz nesnelerden oluşan bir Koleksiyon sınıfı - Linq to Objects .

LINQ, sorgulama teknolojisini açıklar, adın geri kalanı sorgulanan verilerin kaynağını tanımlar.

Biraz daha fazla arka plan için:

Veri kümeleri, verilerin bir veritabanından .net Veri Kümesine yüklendiği ADO.net nesneleridir ve Linq yüklendikten sonra bu verileri sorgulamak için kullanılabilir.

Linq to SQL ile veritabanına eşlenen .net sınıflarını tanımlarsınız ve Linq-to-SQL verileri SQL sunucu veritabanından yüklemeyi halleder.

Ve son olarak Varlık çerçevesi , XML'de bir veritabanı ve nesne eşlemesi tanımlayabileceğiniz ve daha sonra bu eşleme yoluyla yüklenen verileri sorgulamak için Linq'i kullanabileceğiniz bir sistemdir.


3
aslında, Linq-to-SQL yalnızca SQL Server'dır - yalnızca "herhangi bir" SQL veritabanı arka ucu değildir.
marc_s

3
@marc_s: İyi yer. Teşekkürler. Bununla birlikte, ilgilenen varsa, isterseniz diğer veritabanları için 3. parti Linq'den sql'ye sağlayıcıları vardır. Başkaları için code2code.net/DB_Linq veya Google'a bakın . Yine de kaliteleri hakkında yorum yapamam.
Simon P Stevens

1
Simon, özellikle Entitiy çerçevesinin bu yararlı 2 satırlık özeti için teşekkürler. +1
Marcel
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.