Here is a little extension we did for doing StoredProcedures on our DbContext:
public static List ExecuteStoredProcedure(this DbContext dbContext, string storedProcedureName, params object[] parameters)
{
string storedProcedureCommand = "CALL " + storedProcedureName + "(";
List augmentedParameters = parameters.ToList();
storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters);
storedProcedureCommand += ");";
return dbContext.Database.SqlQuery(storedProcedureCommand).ToList();
}
public static List ExecuteStoredRecursiveProcedure(this DbContext dbContext, string storedProcedureName, params object[] parameters)
{
string storedProcedureCommand = "SET max_sp_recursion_depth = " + maxRecursionCount + "; CALL " + storedProcedureName + "(";
List augmentedParameters = parameters.ToList();
storedProcedureCommand = AddParametersToCommand(storedProcedureCommand, augmentedParameters);
storedProcedureCommand += ");";
return dbContext.Database.SqlQuery(storedProcedureCommand).ToList();
}
private static string AddParametersToCommand(string storedProcedureCommand, List augmentedParameters)
{
for (int i = 0; i < augmentedParameters.Count(); i++)
{
storedProcedureCommand = AddParameterToCommand(storedProcedureCommand, augmentedParameters, i);
}
return storedProcedureCommand;
}
private static string AddParameterToCommand(string storedProcedureCommand, List augmentedParameters, int i)
{
if (augmentedParameters[i].GetType() == typeof(string))
{
storedProcedureCommand += "'";
}
storedProcedureCommand += (augmentedParameters[i].ToString());
if (augmentedParameters[i].GetType() == typeof(string))
{
storedProcedureCommand += "'";
}
if (i < augmentedParameters.Count - 1)
{
storedProcedureCommand += ",";
}
return storedProcedureCommand;
}