如何将我的存储过程结果映射到我的类中

How to map my stored procedure result in my class

提问人:Ahsan Ali Siddiqi 提问时间:8/5/2023 最后编辑:marc_sAhsan Ali Siddiqi 更新时间:8/5/2023 访问量:91

问:

我在 SQL Server 中有 3 个表。第一个用于订单,第二个用于订单行项目,第三个用于订单日志。

这是我的数据库的图表:

发短信

这是我的 SQL Server 存储过程查询:

SELECT 
    table1.ID AS OrderID,
    table1.Account,
    table1.OrderNumber,
    table2.OrderID AS OrderLineItemID,
    table2.ID, table2.Price,
    orderlog.ID AS OrderLogID,
    orderlog.OrderLog
FROM 
    [dbo].[Order] AS table1
LEFT JOIN 
    OrderLineItems AS table2 ON table1.ID = table2.OrderID
LEFT JOIN 
    [dbo].[OrderLog] AS orderlog ON table1.ID = orderlog.OrderID 
WHERE
    table1.ID = @orderID

下面附上了存储过程执行结果时的结果图片。

发短信

这是我的班级:OrderView

public class OrderView
{
    public int ID { get; set; }
    public string OrderNumber { get; set; }
    public string Account { get; set; }
    public  List<OrderLineItem> OrderLineItems { get; set; }
    public  List<OrderLog> OrderLogs { get; set; }
}

我怎样才能做到这一点,以便每当它调用存储过程来获取记录时,它都会映射到我的类而不使用循环?我在 MVC 5 中使用具有数据库优先方法 ASP.NET 实体框架。

C# sql-server asp.net-mvc 实体框架

评论

0赞 Mohammad Aghazadeh 8/5/2023
使用 Dapper
0赞 jdweng 8/5/2023
我会填充数据表而不是类。请参阅:aspsnippets.com/Articles/...
0赞 Ahsan Ali Siddiqi 8/5/2023
除了 dapper 之外,@MohammadAghazadeh还有其他方法吗,因为我的项目是基于实体框架的。
0赞 Gert Arnold 8/6/2023
EF 无法从存储过程结果填充对象图(=具有嵌套对象的对象)。只有这样。Include

答:

0赞 MRP 8/5/2023 #1

我想你可以这样使用:MapToStoredProcedures()

public class OrderView
{
    public int ID { get; set; }
    public string OrderNumber { get; set; }
    public string Account { get; set; }
    public List<OrderLineItem> OrderLineItems { get; set; }
    public List<OrderLog> OrderLogs { get; set; }
}

public class OrderLineItem
{
    public int ID { get; set; }
    public int OrderID { get; set; }
    public decimal Price { get; set; }
}

public class OrderLog
{
    public int ID { get; set; }
    public int OrderID { get; set; }
    public string OrderLog { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<OrderView> OrderViews { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<OrderView>().MapToStoredProcedures();
        base.OnModelCreating(modelBuilder);
    }
}

或者你可以使用Database.SqlQuery<T>

public IEnumerable<OrderView> GetOrderView(int orderID)
{
    var parameters = new SqlParameter[] {
        new SqlParameter("@orderID", orderID)
    };
    
    var result = this.Database.SqlQuery<OrderView>(
        "EXEC dbo.MyStoredProcedure @orderID",
        parameters);
    
    return result.ToList();
}

评论

0赞 Ahsan Ali Siddiqi 8/7/2023
我已经执行了 GetOrderView 方法,它在订单行项目和订单日志中显示 null。我在 ASP.Net MVC 5 中使用数据库优先方法,实体版本框架是 6.0。这是我的结果。图像