如何将存储过程结果映射到自定义类?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将存储过程结果映射到自定义类?相关的知识,希望对你有一定的参考价值。

我正在使用entity framework 5,我已经为我的.edmx模型添加了两个存储过程。

第一个存储过程返回一个字符串,如果我在Visual Studio中打开模型浏览器,我可以更改Returns a Collection Of节并将标量类型设置为String,如下所示:

ScalarType

然后在代码中,我可以调用SP并获得如下结果:

using (var context = new MyEntities())
{
    var spResult = context.mySPNameFromTheModel(exampleParameter1, exampleParameter2); // This will get the output as string
}

上面的例子运行正常,但我怎么能用复杂类型做同样的事情呢?

我的第二个存储过程只返回一行,有两列,两个字符串。所以我创建了一个具有两个字符串属性的类,但是当我更改为Complex时我看不到它,我无法从下拉列表中选择任何内容,因为它是空的。 ComplexType

当我点击Get Column Information时,它只是说SP没有返回任何列,这不是真的。

答案
  • 检查edmx是否使用相应的存储过程进行更新
  • 尝试在模型浏览器中手动创建复杂类型。
  • 保存和重建解决方案
  • 然后尝试添加函数导入并给出函数importname,sp&in Returns Collection选择手动创建的复杂类型。
  • 现在单击获取列信息。
  • 然后单击确定。
另一答案

我发现这篇Mapping Stored Procedure Output to POCO Class文章对于回答标题中指定的问题非常有帮助,因为我正在寻找一种方法来做到这一点,而无需在使用ADO.NET时编写字符串的麻烦。

public IList<Order> GetOrders(string CustomerID)
{
    var orders = new List<Order>();
    using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    {
        // Use count to get all available items before the connection closes
        using (SqlCommand cmd = new SqlCommand("PagingProcTest", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@CustomerID", SqlDbType.NChar).Value = CustomerID;

            cmd.Connection.Open();

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                // Map data to Order class using this way
                orders = DataReaderMapToList<Order>(reader).ToList();

                // instead of this traditional way
                // while (reader.Read())
                // {
                    // var o = new Order();
                    // o.OrderID = Convert.ToInt32(reader["OrderID"]);
                    // o.CustomerID = reader["CustomerID"].ToString();
                    // orders.Add(o);
                // }
            }
            cmd.Connection.Close();
        }
    }
    return orders;
}

private static List<T> DataReaderMapToList<T>(DbDataReader dr)
{
    List<T> list = new List<T>();
    while (dr.Read())
    {
        var obj = Activator.CreateInstance<T>();
        foreach (PropertyInfo prop in obj.GetType().GetProperties())
        {
            if (!Equals(dr[prop.Name], DBNull.Value))
            {
                prop.SetValue(obj, dr[prop.Name], null);
            }
        }
        list.Add(obj);
    }
    return list;
}
另一答案

尝试将别名添加到从SP返回的列。例如:SELECT table1.id ID

以上是关于如何将存储过程结果映射到自定义类?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKit 将 NSManagedObject 实体映射到自定义类

使用敲除映射插件将深度层次化的对象映射到自定义类

将嵌套对象作为道具映射到自定义组件

从实体框架映射到自定义域模型类?

如何使用 RKMappingOperation 将本地 NSDictionary 映射到自定义对象?

如何使用 Entity Framework Core 5.0 将复杂 SQL 查询的结果行映射到自定义 DTO?