EF和存储过程返回动态结果

时间:2014-03-11 01:59:32

标签: c# entity-framework

我有一个带有输入的存储过程,该输入定义了返回的列。

如何迭代结果?

我尝试过类似的解决方案:

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不是一个选项。

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题,不得不回到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();

现在您应该可以访问字段名称和结果。

虽然这不是最漂亮的解决方案,但它可以完成工作。建议欢迎。

答案 1 :(得分:0)

我在测试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或直接转换确定的逻辑将每个元素转换为正确的类型。