首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EF和存储过程返回动态结果

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

Stack Overflow用户
提问于 2014-03-11 09:59:32
回答 2查看 5.1K关注 0票数 2

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

如何遍历结果?

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

代码语言:javascript
运行
复制
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是不可行的。

任何帮助我们都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2014-08-20 22:58:14

今天我遇到了同样的问题,不得不求助于SqlCommand而不是直接使用对象上下文。

代码语言:javascript
运行
复制
    // 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
EN

Stack Overflow用户

发布于 2014-03-11 10:11:01

我在测试JsonResults时遇到了类似的问题。您可能会对我编写的一个little extension感兴趣,它允许您将object转换为动态,这将允许您挂钩到每个对象上的运行时动态绑定。

它可能看起来像这样:

代码语言:javascript
运行
复制
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或直接强制转换的逻辑来确定的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22315003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档