Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有实体框架的WebApi通用存储过程端点_C#_Entity Framework_Generics_Stored Procedures_Asp.net Web Api - Fatal编程技术网

C# 具有实体框架的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

我正在尝试为运行EF6的WebApi创建一个通用存储过程端点

其思想是,我们可以通过传递名称和参数来调用存储过程。我有以下几点:

[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来解决这个问题。