[解決済み] LINQ-to-SQLとストアドプロシージャの比較?[クローズド]
2022-04-13 15:30:30
質問
StackOverflowの「"Beginner's Guide to LINQ"」という投稿を見てみたんですが、( LINQ初心者向けガイド )ですが、続きの質問がありました。
私たちは新しいプロジェクトを立ち上げようとしていますが、そこではデータベース操作のほぼすべてがかなり単純なデータ検索になります(すでにデータを書き込んでいるプロジェクトの別のセグメントがあります)。これまでの他のプロジェクトのほとんどは、このようなことにストアドプロシージャを使用しています。しかし、もしそれがより理にかなっているなら、LINQ-to-SQLを活用したいと思います。
そこで、質問はこうです。単純なデータ検索では、LINQ-to-SQLとストアドプロックのどちらのアプローチが良いでしょうか?具体的な長所や短所があれば教えてください。
ありがとうございます。
解決方法は?
LINQがスプロックに勝るいくつかの利点。
- <強い 型の安全性 : これはみんな理解していると思います。
- 抽象化 : については特にそうです。 LINQ-to-Entities(リンクトゥエンテイティ . また、この抽象化により、フレームワークは、あなたが簡単に利用できるような改良を追加することができます。 PLINQ は、LINQにマルチスレッドサポートを追加した例です。 このサポートを追加するためのコードの変更は最小限です。 単にsprocを呼び出すだけのこのデータアクセスコードを行うのは、非常に難しいでしょう。
- デバッグ対応 : どの.NETデバッガでもクエリのデバッグに使えますね。 スプロックでは、SQLを簡単にデバッグすることはできませんし、その経験はデータベース・ベンダに大きく依存します(MS SQL Serverはクエリ・アナライザを提供しますが、それだけでは十分ではないことが多いです)。
- <強い ベンダーに依存しない : LINQは多くのデータベースで動作し、サポートされるデータベースの数は増える一方です。 スプロックは、構文や機能のサポートが異なるため(データベースがスプロックをサポートしている場合)、データベース間で常に移植可能とは限りません。
- デプロイメント : 他の人も既に述べていますが、スプロックのセットをデプロイするよりも、単一のアセンブリをデプロイする方が簡単です。 これは#4とも関連しています。
- <強い 簡単 : データアクセスを行うためにT-SQLを学ぶ必要はありませんし、スプロックを呼び出すために必要なデータアクセスAPI(例:ADO.NET)も学ぶ必要はありません。 これは、#3、#4と関連している。
LINQとsprocの比較によるデメリットをいくつか。
- ネットワークトラフィック LINQはクエリ全体を送信しますが、sprocはsproc-nameと引数データのみをシリアル化すればよいのです。 これは、クエリーが非常に複雑な場合、非常に悪くなる可能性があります。 しかし、LINQの抽象化により、Microsoftはこの点を時間をかけて改善することができます。
- <強い 柔軟性が低い : Sprocsはデータベースの機能セットをフルに活用できる。 LINQは、より汎用的にサポートする傾向がある。 これは、あらゆる種類の言語の抽象化(例:C#とアセンブラ)に共通することです。
- リコンパイル : データアクセスの方法を変更する必要がある場合、アセンブリを再コンパイル、バージョンアップ、再デプロイする必要があります。 Sprocsは 時々 DBA は、何も再展開することなく、データアクセスルーチンを調整することができます。
セキュリティや管理性についても議論されることがありますね。
- セキュリティ : 例えば、テーブルへの直接アクセスを制限し、スプロックにACLを置くことで機密データを保護することができます。 しかし、LINQでは、テーブルへの直接アクセスを制限し、代わりに更新可能なテーブルにACLを置くことができる。 見解 を使用することで、同様の目的を達成することができます (データベースが更新可能なビューをサポートしていると仮定しています)。
- 管理性 : ビューを使用すると、スキーマの変更(テーブルの正規化など)からアプリケーションを壊さないようにすることができるという利点もあります。 データアクセスのコードを変更することなく、ビューを更新することができます。
私は以前はsprocの大ファンでしたが、一般的にはLINQの方が良いのではないかと思い始めています。 もしsprocの方が明らかに優れている部分があれば、sprocを書きつつもLINQを使ってアクセスすることになるでしょうね。)
関連
-
[解決済み] LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] LINQのGroup by
-
[解決済み] DataTableに対するLINQクエリ
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] ストアドプロシージャ/ファンクション一覧 Mysqlコマンドライン
-
[解決済み] LINQ を使用して、オブジェクトのリストから一意のプロパティのリストを取得するにはどうすればよいですか?
-
[解決済み] 指定された型メンバー 'Date' は LINQ to Entities でサポートされていません。イニシャライザ、エンティティ・メンバ、およびエンティティ・ナビゲーション・プロパティのみです。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] IEnumerable<T>のforeachのLINQでの等価性
-
[解決済み】Stored ProcsでSQLを保持する場合とコードで保持する場合の長所と短所を教えてください【終了しました
-
[解決済み】LINQ グループバイをディクショナリーオブジェクトに入れる
-
[解決済み] LINQ-to-SQLとストアドプロシージャの比較?[クローズド]
-
[解決済み] LINQ を使用して、オブジェクトのリストから一意のプロパティのリストを取得するにはどうすればよいですか?
-
[解決済み] LINQを使用してデータをPivotすることは可能ですか?
-
[解決済み] Linqのgroup byのカウントを持つ
-
[解決済み] 指定された型メンバー 'Date' は LINQ to Entities でサポートされていません。イニシャライザ、エンティティ・メンバ、およびエンティティ・ナビゲーション・プロパティのみです。
-
[解決済み] LINQ: 区分された値
-
[解決済み] LINQ OrderByとThenByの比較