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

本文关键字:动态 结果 返回 存储过程 EF | 更新日期: 2023-09-27 17:49:19

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

如何遍历结果?

我已经尝试了类似的解决方案:

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

感谢您的帮助

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

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

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

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

我在测试JsonResults时遇到了类似的问题。您可能对我写的一个小扩展感兴趣,它允许您将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或直接强制转换的任何逻辑的适当类型。