C# 具有实体框架的WebApi通用存储过程端点
我正在尝试为运行EF6的WebApi创建一个通用存储过程端点 其思想是,我们可以通过传递名称和参数来调用存储过程。我有以下几点:C# 具有实体框架的WebApi通用存储过程端点,c#,entity-framework,generics,stored-procedures,asp.net-web-api,C#,Entity Framework,Generics,Stored Procedures,Asp.net Web Api,我正在尝试为运行EF6的WebApi创建一个通用存储过程端点 其思想是,我们可以通过传递名称和参数来调用存储过程。我有以下几点: [HttpPost] [CustomAuthFilter] [Route("storedproc/{storedproc}")] public IHttpActionResult RunStoredProcedure(string storedproc, Dictionary<string,string> parameters) { var res
[HttpPost]
[CustomAuthFilter]
[Route("storedproc/{storedproc}")]
public IHttpActionResult RunStoredProcedure(string storedproc, Dictionary<string,string> parameters)
{
var response = Repo.RunSP(storedproc, parameters);
return Ok(response);
}
[HttpPost]
[CustomAuthFilter]
[路由(“storedproc/{storedproc}”)]
公共IHttpActionResult RunStoredProcess(字符串storedproc,字典参数)
{
var响应=Repo.RunSP(storedproc,参数);
返回Ok(响应);
}
其中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;
}
}
公共静态字符串RunSP(字符串存储过程、字典参数)
{
使用(var dataContext=new dbContext())
{
var queryString=new StringBuilder();
queryString.Append(存储过程);
queryString.Append(“”);
整数计数=0;
var param=新列表();
if(参数!=null)
{
foreach(参数中的var对)
{
追加(“@”+pair.Key+”={“+count+”}”);
计数++;
if(计数<参数计数)
queryString.Append(“,”);
参数相加(对值);
}
}
var json=dataContext.Database.SqlQuery(queryString.ToString(),param);
返回json;
}
}
现在的问题是如何在结尾处将返回结果序列化为匿名json字符串?这可能吗?如果可能,如何实现?由于该方法是泛型的,我无法序列化到特定的类
如果我必须使用EF以外的其他工具来获得此功能,那么最好的方法是什么?这将不可能轻松使用EF。有人真的试过了,我发现了。您可以自己使用原始数据,使用
SqlDataReader
来填充、序列化数据,然后像字符串一样返回数据。最简单的解决方案是使用dynamic
获取结果,然后使用序列化并返回结果
using(SqlConnection con = new SqlConnection(ConnectionString))
{
var result = await con.QueryAsync("QueryString", new { param = "param" });
return JsonConver.SerializeObject(result);
}
从安全角度来看,这不是一个好主意。我可以传递一个字符串“select'drop table'+table_name from information_schema.tables where table_type='base table'”,然后将结果传递给您的api。嗨,Jules,Bobby tables问题是一个问题,但是端点上有一个安全过滤器,并且只允许访问授权的dbs。感谢您的确认。我想是的,所以我最终用ado.net来解决这个问题。