具有实体框架的WebApi的通用存储过程端点

时间:2015-10-23 05:55:25

标签: c# entity-framework generics stored-procedures asp.net-web-api

我正在尝试为运行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之外的其他东西来获得此功能,那么最佳方法是什么?

1 个答案:

答案 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);
}