我有一个带有输入的存储过程,该输入定义了返回的列。
如何迭代结果?
我尝试过类似的解决方案:
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不是一个选项。
感谢任何帮助
答案 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
或直接转换确定的逻辑将每个元素转换为正确的类型。