2011-12-29 8 views
1

最近のプロジェクトの1つでは、SQLを生成して最後に実行するストアドプロシージャを作成しました。ストアドプロシージャの目的は、動的列に基づいてピボットを作成することでした。Entity Frameworkの動的SQLベースのストアドプロシージャコール

ストアドプロシージャにアクセスしようとしたときに通常の関数インポートを使用してEntity Frameworkを使用してアクセスしようとすると、取得したデータを格納するために動的な型が必要なため、何かが返されます。

私たちのケースでは動的クエリで、linqは返された列を取得できませんでした。したがって、私がしたことを回避するには、従来の方法、つまりDataAdapterSqlCommandオブジェクトとSqlConnectionオブジェクトを作成するという方法でストアドプロシージャを呼び出していました。

しかし、Entity Frameworkを使用してこの種のストアドプロシージャを呼び出す正しい方法は何ですか?

ありがとうございます。

+0

と私はここで追加する必要があります私は自分で複雑な型を作成することはできません返される列は、将来的に増減することができます。 – Wajeeh

答えて

2

Entity Frameworkは、ストアドプロシージャの動的結果セットをサポートしていません。プロシージャから静的な結果セット宣言を取得できないため、動的SQLを使用するストアド・プロシージャもサポートしていません。したがって、プロシージャが常に静的型(同じ名前の列)を返すか、従来のADO.NETを使用してそのプロシージャを実行する必要があります。

+0

k次回はこのようなことに感謝します:) – Wajeeh

+0

@Ladislav Mrnka EF 4のダイナミックタイプでこれが可能ですか?動的な結果セットを持つ動的オブジェクトを取得するために 'DbContext.Database.SqlQuery()'を動的型で使用できますか?私はここで何か他のものを達成しようとしています:[動的ユーザ拡張可能エンティティ使用エンティティフレームワーク] http://stackoverflow.com/questions/15019705/dynamic-user-extensible-entities-using-エンティティフレームワーク – Mortalus

+0

@Mortalus:答えはノーです。 EFは動的な型では機能しません。さらに、ユーザー拡張可能エンティティ(実行時に列を追加するという点で)にとっては、優れた技術ではありません。 –

1

以下のステップが続くことができる:

  1. ストア変数内部SPの動的部分とSPの終了時に印刷変数。

  2. SPを実行してデータを実行します。

  3. [結果]ウィンドウの[メッセージ]タブを開きます。

  4. copy(x row(s)affected)の後に書かれたコード。

  5. SPにコードを記述し、変数宣言まで他のすべてをコメントアウトして貼り付けます。

  6. 新しい変更されたSPを実行し、それをエンティティフレームワークに追加します。今回、エンティティ・フレームワークは、あなたが必要とする複雑な型を作ります。

  7. 前のコメントコードのコメントを外し、メッセージタブからコピーしたデータを削除してもう一度実行します。

SPを追加または削除するたびに同じプロセスを実行します。

+0

非常にいたずら。しかし私はそれが好きです。 – Benjol

関連する問題