ストアド プロシージャを使用して、エンティティ フレームワーク VS LINQ から SQL VS ADO.NETまでを使用しますか?




linq-to-sql entity-framework (3)

以下の面でそれぞれどのように評価しますか?

  1. パフォーマンス
  2. 開発のスピード
  3. きちんとした、直感的でメンテナンス可能なコード
  4. 柔軟性
  5. 全体

私は自分のSQLが好きで、いつもADO.NETとストアドプロシージャの大ヒットなファンでしたが、最近Linq to SQLを使って遊んでいましたが、DataAccessレイヤーを書いていて、 LinqとSQLまたはEFのどちらかを実際に理解しているか、どちらもありませんか?

私は、私の研究時間を無駄にするこれらの技術に大きな欠陥はないことを確認したいだけです。 例えばパフォーマンスはひどいですが、シンプルなアプリではクールですが、これまでのところあなたを惹きつけることはできません。

アップデート: ORM VS SPではなくEF VS L2S VS SPに集中できますか? 私は主にEF VS L2Sに興味があります。 しかし、普通のSQlは私がたくさん知っているものなので、保存されたprocsとの比較をしたいと思っています。


LINQ-to-SQLは非常に使いやすく、バックエンドに非常に良いクエリを生成する驚異的なテクノロジです。 LINQ-to-EFはそれに取って代わるものと予想されていましたが、歴史的に非常に使いこなし難く、はるかに劣ったSQLを生成しました。 私は現在の状況を知らないが、MicrosoftはL2Sのすべての良さをL2EFに移行することを約束した。

個人的には、私はORMツールを熱心に嫌っています(詳細は私の批判をhereしてください)、L2Sはデータアクセスレイヤーから必要と思われるものすべてを提供しているので、L2EFを支持する理由はありません。 実際には、手作りのマッピングや継承モデリングなどのL2Sの機能は完全に不要な複雑さを増すと私は考えています。 しかし、それは私だけです。 ;-)


ストアドプロシージャ:

(++)

  • 優れた柔軟性
  • SQLに対する完全な制御
  • 利用可能な最高のパフォーマンス

( - )

  • SQLに関する知識が必要です
  • ストアドプロシージャがソース管理から外れています
  • 同じテーブル名とフィールド名を指定している間、「自分自身を繰り返す」という実質的な量。 DBエンティティの名前を変更してどこかの参照を失った後で、アプリケーションを壊す可能性が高い
  • 遅い開発

ORM:

(+)

  • 急速な発展
  • ソース管理下のデータアクセスコード
  • あなたはDBの変更から隔離されています。 その場合、モデル/マッピングを1か所で更新するだけで済みます。

( - )

  • パフォーマンスが悪化する可能性があります
  • ORMが生成するSQLに対する制御がほとんどまたはまったくない(非効率的または悪いバグかもしれない)。 介入して、カスタムストアドプロシージャに置き換える必要があります。 それはあなたのコードが乱雑になります(コード内のLINQ、コード内のSQL、ソース管理のDB外)。
  • どんな抽象化でも、フードの下でどのように動作するかわからない「高水準」の開発者を生み出すことができる

一般的なトレードオフは、大きな柔軟性を持ち、多くの時間を失うことと、あなたができることに制限されていますが、非常に迅速に完了することとの間のトレードオフです。

この質問に対する一般的な答えはありません。 それは聖戦の問題です。 また、手元のプロジェクトやニーズにもよります。 あなたのために最適なものを選んでください。


まず最初に、新しいプロジェクトを開始する場合はEntity Framework( "EF")を使用してください。LinqからSQLに比べてはるかに優れたSQLを生成し、Linq to SQLよりも保守しやすく、 L2S ")。 .NET 4.0のリリース時点で、LinqはSQLを古くなったテクノロジとみなしています。 MSは、L2S開発をさらに続行しないことについて非常にオープンです。

1)パフォーマンス

これは答えるのが難しいです。 大部分の単一エンティティ操作( CRUD )では、3つの技術すべてで同等のパフォーマンスが得られます。 あなたは、EFとLinq to SQLをいかにして最大限に活用するかを知る必要があります。 ポーリングクエリのような大量の操作では、EF / L2Sがエンティティクエリを「コンパイル」して、フレームワークがSQLを絶えず再生成する必要がないか、スケーラビリティの問題に遭遇することがあります。 (編集を参照)

膨大な量のデータを更新する一括更新の場合、更新を実行するためにワイヤを介してORMにデータをマーシャリングする必要がないため、未加工SQLまたはストアドプロシージャは常にORMソリューションよりも優れたパフォーマンスを発揮します。

2)開発のスピード

ほとんどのシナリオで、開発のスピードについては、EFは裸のSQL /ストアドプロシージャを吹き飛ばすでしょう。 EFデザイナは、データベースが変更されたときに(要求に応じて)データベースからモデルを更新できるため、オブジェクトコードとデータベースコードの間で同期の問題が発生することはありません。 私がORMの使用を検討していないのは、あなたが更新をしていないレポート/ダッシュボードタイプのアプリケーションを実行しているときや、データベースに対して生データ保守操作を行うだけのアプリケーションを作成しているときです。

3)ニート/メンテナンス可能なコード

EFはSQL / sprocsを打ち負かす。 関係がモデル化されているため、コード内の結合は比較的まれです。 ほとんどのクエリでは、エンティティの関係は読者にとってほとんど自明です。 実際にデータに何が起こっているのかを理解するために、階層型から階層型のデバッグや複数のSQL /中間層を使用する必要があります。 EFは非常に強力な方法でコードにデータモデルをもたらします。

4)柔軟性

ストアドプロシージャと未加工SQLはより柔軟性があります。 sprocsとSQLを活用して、奇妙なケースに対してより高速なクエリを生成することができます。また、ネイティブDB機能をORMより簡単に活用できます。

5)全体的

ストアドプロシージャを使用してORMを選択する誤った二分法に巻き込まれないようにしてください。 あなたは同じアプリケーションで両方を使うことができます。おそらくそうでしょう。 大きなバルク操作は、ストアドプロシージャまたはSQL(実際にEFによって呼び出すことができる)に入れてください。また、EFは、CRUD操作とほとんどの中間層のニーズに使用する必要があります。 おそらく、レポートを書くためにSQLを使用することを選択します。 私は、物語の道徳はいつもと同じだと思う。 ジョブには適切なツールを使用します。 しかし、そのスキニーは、EFは今日は非常に良いです(.NET 4.0)。 リアルタイムで読んで理解し、驚くほど高性能のアプリを簡単に作成することができます。

編集 :EF 5は、 自動コンパイルされたLINQクエリを使用してこの部分を少し簡略化しますが、実際の大量のものについては、現実世界で最適なものをテストして分析する必要があります。





linq-to-entities