我有一个存储过程,它的输入定义了返回的列。
如何遍历结果?
我尝试过类似的解决方案:
var selectColsParam = new System.Data.SqlClient.SqlParameter()
    {
        ParameterName = "@SelectCols",
        Value = "Person.FirstName",
    };
string sql = string.Format("dbo.DynamicResultSP {0} ", selectColsParam.ParameterName);
var result = db.Database.SqlQuery<List<dynamic>>(sql, selectColsParam);在最好的情况下,'result‘包含我可以迭代的正确行数,但'row’本身只是一个对象,我似乎不能对它做任何事情。
我不需要知道列名,但需要能够遍历字段。
我知道有一个根据输入返回不同列的存储过程不被认为是好的设计,但是,这是我必须使用的,所以更改SP是不可行的。
任何帮助我们都将不胜感激
发布于 2014-08-20 22:58:14
今天我遇到了同样的问题,不得不求助于SqlCommand而不是直接使用对象上下文。
    // Retrieve the connection from the object context
    var entityConnection = this.ObjectContext.GetConnection() as EntityConnection;
    var dbConnection = entityConnection.StoreConnection as SqlConnection;
    // Create the command and associated parameters (dynamically passed in perhaps)
    var command = new SqlCommand("dbo.DynamicResultSP");
    command.Parameters.AddWithValue("@SelectCols", "Person.FirstName");
    ////command.Parameters.AddWithValue("@AnotherParameter", "Parameter.SecondValue");
    ////command.Parameters.AddWithValue("@AThirdParameter", "YetAnotherValue");
    dbConnection.Open();
    using (var reader = command.ExecuteReader())
    {
        // Get the column names
        columnNames = new string[reader.FieldCount];
        for (int i = 0; i < reader.FieldCount; i++)
        {
            columnNames[i] = reader.GetName(i);
        }
        // Get the actual results
        while (reader.Read())
        {
            var result = new string[reader.FieldCount];
            for (int i = 0; i < reader.FieldCount; i++)
            {
                result[i] = reader[i].ToString();
            }
            results.Add(result);
        }
    }
    dbConnection.Close();现在,您应该可以访问字段的名称和结果。
虽然这不是最好的解决方案,但它可以完成工作。欢迎提出建议。
发布于 2014-03-11 10:11:01
我在测试JsonResults时遇到了类似的问题。您可能会对我编写的一个little extension感兴趣,它允许您将object转换为动态,这将允许您挂钩到每个对象上的运行时动态绑定。
它可能看起来像这样:
var result = db.Database.SqlQuery<List<object>>(sql, selectColsParam);
var dynamicResults = result.Select(o => o.AsDynamic()).ToList();
foreach (dynamic item in dynamicResults)
{
   // treat as a particular type based on the position in the list
}也有可能,您可能只需要将每个元素转换为适当的类型,这是基于您必须使用Convert或直接强制转换的逻辑来确定的。
https://stackoverflow.com/questions/22315003
复制相似问题