Skip to content

投稿

Code Firstでストアドプロシージャを呼び出す

2014年10月16日 • 2分で読める

Code Firstでストアドプロシージャを呼び出す

Entity Framework 6 Code Firstの弱点の一つは、データベース構造(ビュー、ストアドプロシージャなど)をネイティブに呼び出すサポートが不足していることです。Entity Framework(EF)のCode-Firstについて聞いたことがない、または使用したことがない方のために説明すると、Code-FirstはシンプルなFluentマッピングAPIです。アイデアは、すべてのデータベースマッピングをコード(つまりC#)で作成し、フレームワークがデータベーススキーマの変更を作成・追跡するというものです。

従来のEntity Frameworkでストアドプロシージャを呼び出すには、EDMXファイルでマッピングする必要がありました。これは複数ステップのプロセスです。プロセスが完了すると、DataContextにぶら下がるメソッドが作成されます。

私はストアドプロシージャの呼び出しをより簡単にすることを目指しました。ストアドプロシージャの核心には、プロシージャ名、N個のパラメータ、そして結果セットがあります。プロシージャ名、パラメータ、戻り値の型を受け取る小さな拡張メソッドを書きました。これは単純に動作します。プロシージャとそのパラメータをマッピングする必要はありません。

public static List<TReturn> CallStoredProcedure<TParameters, TReturn>(this DataContext context, string storedProcedure, TParameters parameters) where TParameters : class where TReturn : class, new()
{
IDictionary<string,object> procedureParameters = new Dictionary<string, object>();
PropertyInfo[] properties = parameters.GetType().GetProperties();

var ps = new List<object>();

foreach (var property in properties)
{
object value = property.GetValue(parameters);
string name = property.Name;

procedureParameters.Add(name, value);

ps.Add(new SqlParameter(name, value));
}

var keys = procedureParameters.Select(p => string.Format("@{0}", p.Key)).ToList();
var parms = string.Join(", ", keys.ToArray());

return context.Database.SqlQuery<TReturn>(storedProcedure + " " + parms, ps.ToArray()).ToList();
}

使用方法

var context = new DataContext();

List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});

著者:Chuck Conwayはソフトウェアエンジニアリングと生成AIを専門としています。ソーシャルメディアで彼とつながりましょう:X (@chuckconway) または YouTube をご覧ください。

↑ トップに戻る

こちらもおすすめ