Я, вероятно, не получал бы прямой доступ к базе данных с контроллера, а скорее абстрагировал бы этот доступ.Не совсем оптимизация производительности, но улучшение дизайна.Поэтому начните с определения модели, которая будет содержать результат хранимой процедуры:
public class MyModel
{
public string Column1 { get; set; }
public string Column2 { get; set; }
}
Затем определите интерфейс хранилища, который будет содержать различные операции в этой модели:
public interface IRepository
{
IEnumerable<MyModel> GetModel(int id);
}
Далеереализовать хранилище:
public class RepositorySql : IRepository
{
public IEnumerable<MyModel> GetModel(int id)
{
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SomeConnectionString"].ConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "NameOfStoredProcedure";
cmd.Parameters.AddWithValue("@parameter", id);
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return new MyModel
{
Column1 = reader["column1"].ToString(),
Column2 = reader["column2"].ToString()
};
}
}
}
}
}
Наконец, ваш контроллер будет использовать хранилище:
public class NameOfStoredProcedureController : Controller
{
private readonly IRepository _repository;
public NameOfStoredProcedureController(IRepository repository)
{
_repository = repository;
}
// Warning don't add this constructor. Use a DI framework instead.
// This kind of constructors are called Poor Man DI (see http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx)
// for more info on why this is bad.
public NameOfStoredProcedureController() : this(new RepositorySql())
{ }
public ActionResult Index(int parameter)
{
var model = _repository.GetModel(parameter);
// Use directly Json, no need to do the serialization manually
return Json(model);
}
}