Beberapa keuntungan dari LINQ dibandingkan sprocs:
- Jenis keamanan : Saya pikir kita semua mengerti ini.
- Abstraksi : Ini terutama berlaku untuk LINQ-to-Entities . Abstraksi ini juga memungkinkan kerangka kerja untuk menambahkan perbaikan tambahan yang dapat Anda manfaatkan dengan mudah. PLINQ adalah contoh menambahkan dukungan multi-threading ke LINQ. Perubahan kode minimal untuk menambahkan dukungan ini. Akan jauh lebih sulit untuk melakukan kode akses data ini yang hanya memanggil sprocs.
- Dukungan debugging : Saya bisa menggunakan .NET debugger untuk men-debug kueri. Dengan sprocs, Anda tidak dapat dengan mudah men-debug SQL dan pengalaman itu sebagian besar terkait dengan vendor database Anda (MS SQL Server menyediakan penganalisis kueri, tetapi seringkali itu tidak cukup).
- Agnostik vendor : LINQ bekerja dengan banyak basis data dan jumlah basis data yang didukung hanya akan meningkat. Sprocs tidak selalu portabel di antara basis data, baik karena beragam sintaks atau dukungan fitur (jika basis data mendukung sprocs sama sekali).
- Penempatan : Yang lain sudah menyebutkan ini, tetapi lebih mudah untuk menggunakan satu perakitan daripada menggunakan satu set sprocs. Ini juga terkait dengan # 4.
- Lebih mudah : Anda tidak harus belajar T-SQL untuk melakukan akses data, Anda juga tidak harus belajar API akses data (misalnya ADO.NET) yang diperlukan untuk memanggil sprocs. Ini terkait dengan # 3 dan # 4.
Beberapa kelemahan dari LINQ vs sprocs:
- Lalu lintas jaringan : sprocs hanya membutuhkan cerita bersambung nama-spro dan data argumen melalui kawat sementara LINQ mengirimkan seluruh kueri. Ini bisa menjadi sangat buruk jika pertanyaannya sangat kompleks. Namun, abstraksi LINQ memungkinkan Microsoft untuk meningkatkan ini dari waktu ke waktu.
- Kurang fleksibel : Sprocs dapat memanfaatkan penuh set fitur database. LINQ cenderung lebih umum dalam mendukungnya. Ini biasa terjadi dalam segala jenis abstraksi bahasa (mis. C # vs. assembler).
- Kompilasi ulang : Jika Anda perlu melakukan perubahan pada cara Anda melakukan akses data, Anda perlu mengkompilasi ulang, versi, dan memindahkan kembali perakitan Anda. Sprocs terkadang dapat memungkinkan DBA untuk menyempurnakan rutinitas akses data tanpa perlu memindahkan apa pun.
Keamanan dan pengelolaan adalah sesuatu yang orang juga perdebatkan.
- Keamanan : Misalnya, Anda dapat melindungi data sensitif Anda dengan membatasi akses ke tabel secara langsung, dan meletakkan ACL pada sprocs. Dengan LINQ, namun Anda masih dapat membatasi akses langsung ke meja dan bukan menempatkan ACL di atas meja diupdate pandangan untuk mencapai akhir yang sama (dengan asumsi Anda mendukung database yang diupdate dilihat).
- Kelola : Menggunakan tampilan juga memberi Anda keuntungan melindungi aplikasi Anda tanpa terputus dari perubahan skema (seperti normalisasi tabel). Anda dapat memperbarui tampilan tanpa memerlukan kode akses data Anda untuk berubah.
Saya dulunya adalah orang besar, tetapi saya mulai condong ke arah LINQ sebagai alternatif yang lebih baik secara umum. Jika ada beberapa area di mana sprocs jelas lebih baik, maka saya mungkin masih akan menulis sproc tetapi mengaksesnya menggunakan LINQ. :)
if
pernyataan setelahnya.Saya pada umumnya seorang pendukung menempatkan segala sesuatu dalam prosedur yang tersimpan, karena semua alasan DBA telah digunakan selama bertahun-tahun. Dalam kasus Linq, memang benar bahwa tidak akan ada perbedaan kinerja dengan permintaan CRUD sederhana.
Tetapi ingatlah beberapa hal ketika mengambil keputusan ini: menggunakan pasangan ORM mana pun yang dekat dengan model data Anda. DBA tidak memiliki kebebasan untuk melakukan perubahan pada model data tanpa memaksa Anda untuk mengubah kode kompilasi Anda. Dengan prosedur tersimpan, Anda dapat menyembunyikan perubahan semacam ini sampai batas tertentu, karena daftar parameter dan hasil yang dikembalikan dari prosedur mewakili kontraknya, dan jeroan dapat diubah sekitar, selama kontrak itu masih dipenuhi .
Dan juga, jika Linq digunakan untuk query yang lebih kompleks, menyetel basis data menjadi tugas yang jauh lebih sulit. Ketika prosedur tersimpan berjalan lambat, DBA dapat benar-benar fokus pada kode secara terpisah, dan memiliki banyak opsi, hanya agar kontrak tetap puas ketika dia selesai.
Saya telah melihat banyak, banyak kasus di mana masalah serius dalam suatu aplikasi ditangani oleh perubahan pada skema dan kode dalam prosedur tersimpan tanpa ada perubahan pada kode yang dikerahkan dan dikompilasi.
Mungkin pendekatan hybird akan menyenangkan dengan Linq? Linq tentu saja dapat digunakan untuk memanggil prosedur tersimpan.
sumber
Linq ke Sql.
Sql server akan men-cache rencana kueri, jadi tidak ada peningkatan kinerja untuk sprocs.
Pernyataan LINQ Anda, di sisi lain, secara logis akan menjadi bagian dan diuji dengan aplikasi Anda. Sprocs selalu sedikit terpisah dan lebih sulit untuk dipertahankan dan diuji.
Jika saya sedang mengerjakan aplikasi baru dari awal sekarang saya hanya akan menggunakan Linq, tidak ada sprocs.
sumber
Untuk pengambilan data dasar saya akan pergi untuk Linq tanpa ragu-ragu.
Sejak pindah ke Linq saya telah menemukan keuntungan berikut:
sumber
LINQ akan mengasapi cache prosedur
Jika aplikasi menggunakan LINQ ke SQL dan kueri melibatkan penggunaan string yang panjangnya bisa sangat bervariasi, cache prosedur SQL Server akan menjadi kembung dengan satu versi kueri untuk setiap panjang string yang mungkin. Sebagai contoh, pertimbangkan pertanyaan sangat sederhana berikut yang dibuat terhadap tabel Person.AddressTypes di database AdventureWorks2008:
Jika kedua kueri ini dijalankan, kita akan melihat dua entri dalam cache prosedur SQL Server: Satu terikat dengan NVARCHAR (7), dan yang lainnya dengan NVARCHAR (11). Sekarang bayangkan jika ada ratusan atau ribuan string input yang berbeda, semuanya dengan panjang yang berbeda. Cache prosedur akan menjadi tidak perlu diisi dengan segala macam rencana berbeda untuk permintaan yang sama persis.
Lebih lanjut di sini: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290
sumber
Saya pikir argumen pro LINQ tampaknya berasal dari orang-orang yang tidak memiliki sejarah dengan pengembangan basis data (secara umum).
Terutama jika menggunakan produk seperti VS DB Pro atau Team Suite, banyak argumen yang dibuat di sini tidak berlaku, misalnya:
Sulit untuk mempertahankan dan Menguji: VS menyediakan pemeriksaan sintaksis lengkap, pengecekan gaya, pengecekan referensial dan kendala dan banyak lagi. Ini juga menyediakan kemampuan pengujian unit lengkap dan alat refactoring.
LINQ membuat pengujian unit yang benar tidak mungkin karena (dalam pikiran saya) gagal tes ACID.
Debugging lebih mudah di LINQ: Mengapa? VS memungkinkan step-in penuh dari kode terkelola dan debugging SP secara teratur.
Dikompilasi menjadi satu DLL daripada skrip penerapan: Sekali lagi, VS datang untuk menyelamatkan di mana ia dapat membangun dan menggunakan basis data lengkap atau membuat perubahan tambahan yang aman data.
Tidak harus belajar TSQL dengan LINQ: Tidak, tetapi Anda harus belajar LINQ - di mana manfaatnya?
Um, aplikasi yang digabungkan secara longgar adalah tujuan akhir dari semua programmer yang baik karena mereka benar-benar meningkatkan fleksibilitas. Mampu mengubah hal-hal dalam isolasi itu fantastis, dan tes unit Anda yang akan memastikan itu masih memberikan hasil yang sesuai.
Sebelum kalian semua kesal, saya pikir LINQ memiliki tempatnya dan memiliki masa depan yang cerah. Tetapi untuk aplikasi yang kompleks dan intensif data, saya pikir tidak siap untuk menggantikan prosedur yang tersimpan. Ini adalah pandangan yang saya gaungkan oleh seorang MVP di TechEd tahun ini (mereka akan tetap tanpa nama).
EDIT: Sisi LINQ to SQL Stored Procedure adalah sesuatu yang masih perlu saya baca lebih lanjut - tergantung pada apa yang saya temukan saya dapat mengubah cacian saya di atas;)
sumber
LINQ baru dan memiliki tempatnya. LINQ tidak ditemukan untuk menggantikan prosedur tersimpan.
Di sini saya akan fokus pada beberapa mitos kinerja & KONTRA, hanya untuk "LINQ to SQL", tentu saja saya mungkin benar-benar salah ;-)
(1) Orang mengatakan statemen LINQ dapat "cache" di SQL server, sehingga tidak kehilangan kinerja. Sebagian benar. "LINQ to SQL" sebenarnya adalah runtime yang menerjemahkan sintaks LINQ ke statemen TSQL. Jadi dari perspektif kinerja, pernyataan SQL ADO.NET kode keras tidak memiliki perbedaan dari LINQ.
(2) Diberikan contoh, UI layanan pelanggan memiliki fungsi "transfer akun". fungsi ini sendiri dapat memperbarui 10 tabel DB dan mengembalikan beberapa pesan dalam satu kesempatan. Dengan LINQ, Anda harus membuat satu set pernyataan dan mengirimkannya sebagai satu batch ke SQL server. kinerja terjemahan LINQ-> TSQL yang diterjemahkan ini hampir tidak dapat menyamai prosedur tersimpan. Alasan? karena Anda dapat men-tweak unit terkecil dari pernyataan dalam prosedur Stored dengan menggunakan alat profiler SQL dan rencana eksekusi, Anda tidak dapat melakukan ini di LINQ.
Intinya adalah, ketika berbicara tabel DB tunggal dan set kecil data CRUD, LINQ secepat SP. Tetapi untuk logika yang jauh lebih rumit, prosedur tersimpan lebih mengutak atik kinerja.
(3) "LINQ to SQL" dengan mudah membuat pemula untuk memperkenalkan babi kinerja. Setiap pria senior TSQL dapat memberi tahu Anda kapan tidak menggunakan CURSOR (Pada dasarnya Anda tidak boleh menggunakan CURSOR dalam TSQL dalam banyak kasus). Dengan LINQ dan loop "foreach" yang menawan dengan kueri, sangat mudah bagi seorang pemula untuk menulis kode seperti itu:
Anda dapat melihat kode yang layak dan mudah ini sangat menarik. Tetapi di bawah tenda, .NET runtime hanya menerjemahkan ini ke kumpulan pembaruan. Jika hanya ada 500 baris, ini adalah 500 baris batch TSQL; Jika ada jutaan baris, ini adalah hit. Tentu saja, pengguna berpengalaman tidak akan menggunakan cara ini untuk melakukan pekerjaan ini, tetapi intinya adalah, sangat mudah untuk jatuh dengan cara ini.
sumber
Kode terbaik adalah tanpa kode, dan dengan prosedur tersimpan Anda harus menulis setidaknya beberapa kode dalam database dan kode dalam aplikasi untuk memanggilnya, sedangkan dengan LINQ ke SQL atau LINQ ke Entitas, Anda tidak perlu menulis tambahan kode di luar kueri LINQ lain selain dari instantiating objek konteks.
sumber
LINQ jelas memiliki tempat dalam database khusus aplikasi dan dalam bisnis kecil.
Tetapi dalam perusahaan besar, di mana basis data pusat berfungsi sebagai pusat data umum untuk banyak aplikasi, kita perlu abstraksi. Kita perlu mengelola keamanan secara terpusat dan menunjukkan riwayat akses. Kita harus dapat melakukan analisis dampak: jika saya membuat sedikit perubahan pada model data untuk melayani kebutuhan bisnis baru, pertanyaan apa yang perlu diubah dan aplikasi apa yang perlu diuji ulang? Tampilan dan Prosedur Tersimpan memberi saya itu. Jika LINQ dapat melakukan semua itu, dan membuat programmer kami lebih produktif, saya akan menyambutnya - apakah ada yang punya pengalaman menggunakannya di lingkungan seperti ini?
sumber
Saya benar-benar tidak melihat ini sebagai manfaat. Mampu mengubah sesuatu dalam isolasi mungkin terdengar bagus secara teori, tetapi hanya karena perubahan memenuhi kontrak tidak berarti itu mengembalikan hasil yang benar. Untuk dapat menentukan hasil yang benar, Anda memerlukan konteks dan Anda mendapatkan konteks itu dari kode panggilan.
sumber
IMHO, RAD = LINQ, RUP = Procs Tersimpan. Saya bekerja untuk perusahaan besar Fortune 500 selama bertahun-tahun, di banyak tingkatan termasuk manajemen, dan terus terang, saya tidak akan pernah mempekerjakan pengembang RUP untuk melakukan pengembangan RAD. Mereka begitu diam sehingga pengetahuan mereka sangat terbatas tentang apa yang harus dilakukan di tingkat proses yang lain. Dengan lingkungan yang sunyi, masuk akal untuk memberikan kontrol DBA atas data melalui titik masuk yang sangat spesifik, karena yang lain terus terang tidak tahu cara terbaik untuk mencapai manajemen data.
Tetapi perusahaan besar bergerak dengan menyakitkan lambat di arena pengembangan, dan ini sangat mahal. Ada kalanya Anda perlu bergerak lebih cepat untuk menghemat waktu dan uang, dan LINQ menyediakan itu dan lebih banyak lagi dalam sekop.
Kadang-kadang saya berpikir bahwa DBA bias terhadap LINQ karena mereka merasa itu mengancam keamanan pekerjaan mereka. Tapi itulah sifat binatang itu, tuan dan nyonya.
sumber
Saya pikir Anda perlu menggunakan procs untuk sesuatu yang nyata.
A) Menulis semua logika Anda dalam LINQ berarti database Anda kurang berguna karena hanya aplikasi Anda yang dapat menggunakannya.
B) Saya tidak yakin bahwa pemodelan objek lebih baik daripada pemodelan relasional.
C) Menguji dan mengembangkan prosedur tersimpan dalam SQL jauh lebih cepat daripada siklus edit kompilasi di lingkungan Visual Studio. Anda cukup mengedit, F5 dan tekan pilih dan Anda pergi ke balapan.
D) Lebih mudah untuk mengelola dan menggunakan prosedur tersimpan daripada rakitan .. Anda cukup meletakkan file di server, dan tekan F5 ...
E) Linq to sql masih menulis kode jelek pada saat Anda tidak mengharapkannya.
Jujur, saya pikir hal yang paling penting bagi MS untuk menambah t-sql sehingga dapat melakukan proyeksi gabungan secara implisit seperti cara LINQ. t-sql harus tahu jika Anda ingin melakukan order.lineitems.part, misalnya.
sumber
LINQ tidak melarang penggunaan prosedur yang tersimpan. Saya telah menggunakan mode campuran dengan LINQ-SQL dan LINQ-storedproc . Secara pribadi, saya senang saya tidak harus menulis procs yang tersimpan .... pwet-tu.
sumber
Juga, ada masalah kemungkinan 2.0 rollback. Percayalah, itu sudah terjadi pada saya beberapa kali, jadi saya yakin itu terjadi pada orang lain.
Saya juga setuju bahwa abstraksi adalah yang terbaik. Seiring dengan kenyataan, tujuan awal ORM adalah untuk membuat RDBMS cocok dengan konsep OO. Namun, jika semuanya bekerja dengan baik sebelum LINQ dengan harus menyimpang sedikit dari konsep OO maka sekrup mereka. Konsep dan kenyataan tidak selalu cocok bersama. Tidak ada ruang untuk fanatik militan di TI.
sumber
Saya berasumsi maksudmu Linq To Sql
Untuk setiap perintah CRUD, sangat mudah untuk membuat profil kinerja prosedur tersimpan vs teknologi apa pun. Dalam hal ini perbedaan antara keduanya akan diabaikan. Cobalah membuat profil untuk objek bidang 5 (tipe sederhana) lebih dari 100.000 kueri pemilihan untuk mengetahui apakah ada perbedaan nyata.
Di sisi lain, real deal-breaker akan menjadi pertanyaan apakah Anda merasa nyaman menempatkan logika bisnis Anda di database Anda atau tidak, yang merupakan argumen terhadap prosedur tersimpan.
sumber
Menurut guru, saya mendefinisikan LINQ sebagai sepeda motor dan SP sebagai mobil. Jika Anda ingin melakukan perjalanan singkat dan hanya memiliki penumpang kecil (dalam hal ini 2), pergi dengan anggun dengan LINQ. Tetapi jika Anda ingin melakukan perjalanan dan memiliki band besar, saya pikir Anda harus memilih SP.
Sebagai kesimpulan, memilih antara sepeda motor atau mobil tergantung pada rute Anda (bisnis), panjang (waktu), dan penumpang (data).
Semoga ini bisa membantu, saya mungkin salah. : D
sumber
Semua jawaban ini condong ke LINQ terutama berbicara tentang EASE of DEVELOPMENT yang lebih atau kurang terhubung dengan kualitas buruk coding atau malas dalam coding. Saya hanya seperti itu.
Beberapa keuntungan atau Linq, saya baca di sini sebagai, mudah untuk diuji, mudah untuk debug dll, tetapi ini tidak ada tempat yang terhubung ke hasil akhir atau pengguna akhir. Ini selalu akan menyebabkan masalah pengguna akhir pada kinerja. Apa gunanya memuat banyak hal dalam memori dan kemudian menerapkan filter dalam menggunakan LINQ?
Sekali lagi TypeSafety, berhati-hati bahwa "kami berhati-hati untuk menghindari kesalahan typecasting" yang lagi-lagi kualitas buruk kami coba tingkatkan dengan menggunakan LINQ. Bahkan dalam kasus itu, jika ada perubahan database, misalnya ukuran kolom String, maka LINQ perlu dikompilasi ulang dan tidak akan menjadi typesafe tanpa itu .. Saya mencoba.
Meskipun, kami menemukan itu baik, manis, menarik dll saat bekerja dengan LINQ, itu memiliki kerugian geser membuat pengembang malas :) dan terbukti 1000 kali itu buruk (mungkin terburuk) pada kinerja dibandingkan dengan Stored Procs.
Berhentilah menjadi malas. Saya berusaha keras. :)
sumber
Untuk operasi CRUD sederhana dengan titik akses data tunggal, saya akan mengatakan pergi untuk LINQ jika Anda merasa nyaman dengan sintaks. Untuk logika yang lebih rumit saya pikir sprocs lebih efisien kinerja-bijaksana jika Anda pandai T-SQL dan operasi yang lebih maju. Anda juga mendapat bantuan dari Tuning Advisor, SQL Server Profiler, men-debug permintaan Anda dari SSMS dll.
sumber
Prosedur tersimpan membuat pengujian lebih mudah dan Anda dapat mengubah kueri tanpa menyentuh kode aplikasi. Juga dengan LINQ, mendapatkan data tidak berarti itu data yang tepat. Dan menguji kebenaran data berarti menjalankan aplikasi tetapi dengan prosedur tersimpan mudah untuk menguji tanpa menyentuh aplikasi.
sumber
Hasilnya dapat diringkas sebagai
LinqToSql untuk situs kecil, dan prototipe. Ini benar-benar menghemat waktu untuk Prototyping.
Sps: Universal. Saya dapat memperbaiki pertanyaan saya dan selalu memeriksa ActualExecutionPlan / EstimatedExecutionPlan.
sumber
http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx
sumber
LINQ dan SQL memiliki tempat masing-masing. Keduanya memiliki kekurangan dan kelebihan masing-masing.
Terkadang untuk pengambilan data yang kompleks, Anda mungkin perlu menyimpan procs. Dan terkadang Anda mungkin ingin orang lain menggunakan proc Anda yang tersimpan di Sql Server Management Studio.
Linq to Entities sangat bagus untuk pengembangan CRUD yang cepat.
Tentu Anda dapat membangun aplikasi hanya menggunakan satu atau yang lain. Atau Anda bisa mencampurnya. Itu semua bermuara pada kebutuhan Anda. Tetapi procs yang disimpan SQL tidak akan hilang dalam waktu dekat.
sumber