我正在尝试为运行EF 6的WebApi创建通用存储过程端点。
我们的想法是,我们可以通过传递名称和参数来调用存储过程。我有以下内容;
[HttpPost]
[CustomAuthFilter]
[Route("storedproc/{storedproc}")]
public IHttpActionResult RunStoredProcedure(string storedproc, Dictionary<string,string> parameters)
{
var response = Repo.RunSP(storedproc, parameters);
return Ok(response);
}
RunSP方法的位置;
public static string RunSP(string storedProcedure, Dictionary<string,string> parameters)
{
using (var dataContext = new dbContext())
{
var queryString = new StringBuilder();
queryString.Append(storedProcedure);
queryString.Append(" ");
int count = 0;
var param = new List<string>();
if (parameters != null)
{
foreach (var pair in parameters)
{
queryString.Append("@" + pair.Key + " = {" + count + "}");
count++;
if (count < parameters.Count)
queryString.Append(",");
param.Add(pair.Value);
}
}
var json = dataContext.Database.SqlQuery<string>(queryString.ToString(), param);
return json;
}
}
现在的问题是在最后将返回到匿名json字符串?这是可能的,如果是这样的话?由于该方法是通用的,我不能序列化到特定的类?
如果我必须使用除EF之外的其他东西来获得此功能,那么最佳方法是什么?
答案 0 :(得分:1)
使用EF很容易实现这一点。实际上有人尝试过这样做我发现它here。您可以自己创建并使用SqlDataReader
填充,序列化,然后将数据作为字符串完成返回here。最简单的解决方案是使用Dapper将结果提取为dynamic
,然后使用Json.net对其进行序列化并返回。
using(SqlConnection con = new SqlConnection(ConnectionString))
{
var result = await con.QueryAsync("QueryString", new { param = "param" });
return JsonConver.SerializeObject(result);
}