1. ホーム
  2. linq

[解決済み] LINQ-to-SQLとストアドプロシージャの比較?[クローズド]

2022-04-13 15:30:30

質問

StackOverflowの「"Beginner's Guide to LINQ"」という投稿を見てみたんですが、( LINQ初心者向けガイド )ですが、続きの質問がありました。

私たちは新しいプロジェクトを立ち上げようとしていますが、そこではデータベース操作のほぼすべてがかなり単純なデータ検索になります(すでにデータを書き込んでいるプロジェクトの別のセグメントがあります)。これまでの他のプロジェクトのほとんどは、このようなことにストアドプロシージャを使用しています。しかし、もしそれがより理にかなっているなら、LINQ-to-SQLを活用したいと思います。

そこで、質問はこうです。単純なデータ検索では、LINQ-to-SQLとストアドプロックのどちらのアプローチが良いでしょうか?具体的な長所や短所があれば教えてください。

ありがとうございます。

解決方法は?

LINQがスプロックに勝るいくつかの利点。

  1. <強い 型の安全性 : これはみんな理解していると思います。
  2. 抽象化 : については特にそうです。 LINQ-to-Entities(リンクトゥエンテイティ . また、この抽象化により、フレームワークは、あなたが簡単に利用できるような改良を追加することができます。 PLINQ は、LINQにマルチスレッドサポートを追加した例です。 このサポートを追加するためのコードの変更は最小限です。 単にsprocを呼び出すだけのこのデータアクセスコードを行うのは、非常に難しいでしょう。
  3. デバッグ対応 : どの.NETデバッガでもクエリのデバッグに使えますね。 スプロックでは、SQLを簡単にデバッグすることはできませんし、その経験はデータベース・ベンダに大きく依存します(MS SQL Serverはクエリ・アナライザを提供しますが、それだけでは十分ではないことが多いです)。
  4. <強い ベンダーに依存しない : LINQは多くのデータベースで動作し、サポートされるデータベースの数は増える一方です。 スプロックは、構文や機能のサポートが異なるため(データベースがスプロックをサポートしている場合)、データベース間で常に移植可能とは限りません。
  5. デプロイメント : 他の人も既に述べていますが、スプロックのセットをデプロイするよりも、単一のアセンブリをデプロイする方が簡単です。 これは#4とも関連しています。
  6. <強い 簡単 : データアクセスを行うためにT-SQLを学ぶ必要はありませんし、スプロックを呼び出すために必要なデータアクセスAPI(例:ADO.NET)も学ぶ必要はありません。 これは、#3、#4と関連している。

LINQとsprocの比較によるデメリットをいくつか。

  1. ネットワークトラフィック LINQはクエリ全体を送信しますが、sprocはsproc-nameと引数データのみをシリアル化すればよいのです。 これは、クエリーが非常に複雑な場合、非常に悪くなる可能性があります。 しかし、LINQの抽象化により、Microsoftはこの点を時間をかけて改善することができます。
  2. <強い 柔軟性が低い : Sprocsはデータベースの機能セットをフルに活用できる。 LINQは、より汎用的にサポートする傾向がある。 これは、あらゆる種類の言語の抽象化(例:C#とアセンブラ)に共通することです。
  3. リコンパイル : データアクセスの方法を変更する必要がある場合、アセンブリを再コンパイル、バージョンアップ、再デプロイする必要があります。 Sprocsは 時々 DBA は、何も再展開することなく、データアクセスルーチンを調整することができます。

セキュリティや管理性についても議論されることがありますね。

  1. セキュリティ : 例えば、テーブルへの直接アクセスを制限し、スプロックにACLを置くことで機密データを保護することができます。 しかし、LINQでは、テーブルへの直接アクセスを制限し、代わりに更新可能なテーブルにACLを置くことができる。 見解 を使用することで、同様の目的を達成することができます (データベースが更新可能なビューをサポートしていると仮定しています)。
  2. 管理性 : ビューを使用すると、スキーマの変更(テーブルの正規化など)からアプリケーションを壊さないようにすることができるという利点もあります。 データアクセスのコードを変更することなく、ビューを更新することができます。

私は以前はsprocの大ファンでしたが、一般的にはLINQの方が良いのではないかと思い始めています。 もしsprocの方が明らかに優れている部分があれば、sprocを書きつつもLINQを使ってアクセスすることになるでしょうね。)