【问题标题】:Map Stored Procedure Result without Columns to a Model将不带列的存储过程结果映射到模型
【发布时间】:2014-07-01 14:30:01
【问题描述】:
我有一个存储过程,它返回两列而不指定它们的名称,一是 ID (int),另一列是字符串。我无法更改存储过程,以便它可以返回带有列名的结果
如果我让 Visual Studio 使用 dbContext 中的存储过程创建 .edmx 文件,它会创建一个具有两个属性的新模型类,称为 Column1 和 Column2。问题是当我运行它时,我收到以下错误:
数据读取器与指定的“Schema.addCliente_Result”不兼容。类型的成员“Column1”在数据读取器中没有同名的对应列。
有没有其他方法可以将结果映射到 dictionary<int,string> 或其他不需要列名的东西?
【问题讨论】:
标签:
c#
sql
sql-server
entity-framework
stored-procedures
【解决方案1】:
您可以尝试使用KeyValuePair。它保存为您的密钥指定的值。如果您有更多对并且想要更轻松地迭代它,您可以创建KeyValuePair 的列表。我不确定这对您的情况是否有帮助,如果没有帮助,请见谅。
KeyValuePair MSDN
【解决方案2】:
也许您可能需要考虑投影,因为您不希望它映射到模型。投影是查询的结果输出到与查询的类型不同的类型。无论哪种方式,您都可以使用存储过程的结果来创建匿名类型或您自己的类。由于没有代码供我参考,我举个例子如下:
用于存储结果的类
public Class Result
{
public int myID {get; set;}
public string myString {get; set;}
}
调用存储过程的代码
string connectionString = ConfigurationManager.AppSettings["MyDatabase"];
var conn = new SqlConnection(connectionString);
conn.Open();
string query = @"my_stored_procedure";
using (var sqlAdpt = new SqlDataAdapter(query, conn))
{
sqlAdpt.SelectCommand.CommandType = CommandType.StoredProcedure;
// Ex: Parameters if your sp takes one
var dataDate = new SqlParameter { ParameterName = "@DataDate", Value = DateTime.Now };
sqlAdpt.SelectCommand.Parameters.Add(dataDate);
var results = new DataSet();
sqlAdpt.Fill(results);
List<Result> resultList = results.Tables[0].AsEnumerable().
Select(dataRow => new Result
{
myID = dataRow.Field<int>("ID"),
myString = dataRow.Field<string>("column_I_cant_change")
}).ToList();
}