Apa perbedaan antara "LINQ ke Entitas", "LINQ ke SQL", dan "LINQ ke Kumpulan Data"

91

Saya telah bekerja cukup lama dengan LINQ. Namun, masih menjadi misteri apa perbedaan sebenarnya antara rasa LINQ yang disebutkan.

Jawaban yang berhasil akan berisi perbedaan singkat di antara mereka. Apa tujuan utama masing-masing rasa, apa manfaatnya, dan apakah ada dampak kinerja ...

NB Saya tahu bahwa ada banyak sumber informasi di luar sana, tetapi saya mencari semacam "lembar sontekan" yang menginstruksikan seorang pemula ke mana harus menuju tujuan tertentu.

Marcel
sumber
2
Lihat juga stackoverflow.com/questions/2438672
Henk Holterman

Jawaban:

110
  • semuanya adalah LINQ - Language Integrated Query - jadi semuanya memiliki banyak kesamaan. Semua "dialek" ini pada dasarnya memungkinkan Anda melakukan pemilihan data gaya-kueri, dari berbagai sumber.

  • Linq-to-SQL adalah upaya pertama Microsoft di ORM - Object-Relational Mapper. Ini hanya mendukung SQL Server. Ini adalah teknologi pemetaan untuk memetakan tabel database SQL Server ke objek .NET.

  • Linq-to-Entities adalah ide yang sama, tetapi menggunakan Entity Framework di latar belakang, seperti ORM - lagi-lagi dari Microsoft, tetapi mendukung beberapa backend database

  • Linq-to-DataSets adalah LINQ, tetapi menggunakan bertentangan dengan "old-style" ADO.NET 2.0 DataSets - pada masa sebelum ORM dari Microsoft, semua yang dapat Anda lakukan dengan ADO.NET adalah mengembalikan DataSets, DataTables, dll., Dan Linq -to-DataSets menanyakan penyimpanan data tersebut untuk data. Jadi dalam kasus ini, Anda akan mengembalikan DataTable atau DataSets (System.Data namespace) dari backend database, dan kemudian menanyakan mereka yang menggunakan sintaks LINQ

marc_s
sumber
1
Selamat atas 50k, Anda sekarang secara resmi menghabiskan terlalu banyak waktu di StackOverflow. ;)
Aaronaught
1
@Aaronaught: terima kasih - dan Anda memang benar! :-) Harus meninggalkan satu kecanduan untuk setiap pria, bukan? Silahkan?!?!?!
marc_s
1
marc_s, terima kasih atas jawaban ini. Dapatkah Anda menceritakan sesuatu tentang kinerja. Dari jawaban Anda, saya akan menebak bahwa Linq-to-Entities adalah yang paling maju dan mungkin paling berkinerja?
Marcel
2
@Marcel: from my gut (tidak ada fakta sulit), saya akan mengatakan: Linq-to-SQL atau tercepat (hanya satu lapisan antara database dan model objek), Linq-to-Dataset sedetik, dan Linq-to -Entities adalah yang terakhir, karena Entity Framework selalu memiliki dua lapisan pemetaan (jadi yang paling kompleks). Tapi sekali lagi: hanya firasat, tidak ada angka untuk mendukungnya
marc_s
3
@marc_s Saya tahu ini adalah posting lama, tetapi LINQ ke Entitas kemungkinan akan lebih cepat daripada LINQ ke Dataset dalam banyak kasus. LINQ ke Dataset sebenarnya bukan tipe, ini LINQ di atas Objek yang Anda gunakan set data sebagai objek. Karena LINQ over object tidak melakukan SQL apa pun, Anda harus terlebih dahulu membuat Dataset Anda dari sumber SQL, dan LINQ over object tidak dapat membantu Anda melakukan optimasi kueri apa pun saat mengambil data ke dalam dataset. Itu dan dataset adalah kinerja yang buruk karena semua kolom dikotakkan dan semua jenis pergeseran itu membunuh kinerja.
Robert McKee
38

LINQ adalah sekumpulan teknologi yang luas, berdasarkan di sekitar (misalnya) sintaks pemahaman kueri, misalnya:

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

yang dipetakan oleh kompilator menjadi kode:

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

dan di sini keajaiban yang sesungguhnya dimulai. Perhatikan bahwa kami belum mengatakan apa yang Fooada di sini - dan kompiler tidak peduli! Selama itu dapat menyelesaikan beberapa metode yang sesuai disebut Whereyang dapat mengambil lambda, dan hasilnya ada beberapa Select metode yang dapat menerima lambda, itu senang.

Sekarang mempertimbangkan bahwa lambda dapat dikompilasi baik dalam metode anonim (delegasi, untuk LINQ-to-Objects, yang mencakup LINQ-to-DataSet), atau untuk ekspresi-pohon (model runtime yang mewakili lambda dalam model objek ).

Untuk data dalam memori (biasanya IEnumerable<T>), ini hanya mengeksekusi delegasi - dengan baik dan cepat. Tapi untuk IQueryable<T>objek-representasi ekspresi (aLambdaExpression<...> ) itu dapat memisahkannya dan menerapkannya pada contoh "LINQ-to-Something".

Untuk database (LINQ-to-SQL, LINQ-to-Entities) ini mungkin berarti menulis TSQL, misalnya:

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

Tapi itu bisa (untuk ADO.NET Data Services, misalnya) berarti menulis permintaan HTTP.

Menjalankan kueri TSQL yang ditulis dengan baik yang mengembalikan sejumlah kecil data lebih cepat daripada memuat seluruh database melalui jaringan dan kemudian memfilter di klien. Keduanya memiliki skenario ideal dan skenario yang salah.

Tujuan dan manfaat di sini adalah untuk memungkinkan Anda menggunakan sintaks tunggal yang diperiksa statis untuk menanyakan berbagai sumber data, dan membuat kode lebih ekspresif (kode "tradisional" untuk mengelompokkan data, misalnya, tidak sangat jelas dalam hal apa yang coba dilakukannya - itu hilang dalam massa kode).

Marc Gravell
sumber
Marc, terima kasih atas wawasan ini. Namun, saya tidak bertanya tentang detail internal seperti itu. -1, maaf, karena tidak menjawab pertanyaan.
Marcel
7
Sebagai seseorang yang menulis penyedia LINQ-nya sendiri, ini adalah jawaban terbaik yang pernah saya lihat sejauh ini. Saya tidak setuju tentang -1.
Dan Barowy
30

LINQ adalah singkatan dari bahasa terintegrasi query. Ini memungkinkan Anda menggunakan bahasa kueri "gaya SQL" langsung di dalam C # untuk mengekstrak informasi dari sumber data.

  • Sumber data tersebut dapat berupa database server SQL - ini adalah Linq ke SQL
  • Sumber data tersebut dapat berupa konteks data objek kerangka entitas - Linq ke entitas .
  • Sumber data tersebut dapat berupa kumpulan data ADO.net - Linq ke Kumpulan Data .

Sumber data itu juga bisa berupa file XML - Linq ke XML .
Atau bahkan hanya kelas Koleksi benda biasa - Linq ke Objek .

LINQ menjelaskan teknologi kueri, nama lainnya menjelaskan sumber data yang ditanyakan.

Untuk sedikit latar belakang tambahan:

Set data adalah objek ADO.net di mana data dimuat dari database ke dalam .net Dataset dan Linq dapat digunakan untuk menanyakan data tersebut setelah dimuat.

Dengan Linq ke SQL Anda menentukan kelas .net yang memetakan ke database dan Linq-ke-SQL menangani pemuatan data dari database server SQL

Dan terakhir, kerangka kerja Entitas adalah sistem di mana Anda dapat menentukan database dan pemetaan objek dalam XML, dan kemudian dapat menggunakan LINQ untuk meminta data yang dimuat melalui pemetaan ini.

Simon P Stevens
sumber
3
sebenarnya, Linq-to-SQL adalah SQL Server saja - bukan sembarang backend database SQL.
marc_s
3
@marc_s: Tempat yang bagus. Terima kasih. Meskipun, jika ada yang tertarik, ada penyedia LINQ hingga sql pihak ke-3 untuk database lain jika Anda menginginkannya. Lihat code2code.net/DB_Linq , atau Google untuk lainnya. Saya tidak bisa mengomentari kualitas mereka.
Simon P Stevens
1
Simon, terima kasih khususnya atas ringkasan 2 baris kerangka kerja Entitiy yang bermanfaat itu. +1
Marcel