我在 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; }
}
我怎样才能做到这一点,以便每当它调用存储过程来获取记录时,它都会映射到我的类而不使用循环?我在 ASP.NET MVC 5 中使用实体框架和数据库优先方法。
我认为你可以使用
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();
}