【发布时间】:2017-07-11 05:53:21
【问题描述】:
我想改进从订单数据库中获取订单和订单项的方式。
我正在使用“使用 System.Data.SqlClient;”
我正在订单表上进行选择,并连接到订单项表。
选择可能会返回如下内容:
OrderId ProductName Price OrderTotal
------------------------------------------
00 Blue Jeans 200,- 500,-
------------------------------------------
00 Red Shirt 100,- 500,-
------------------------------------------
00 Green Shirt 100,- 500,-
------------------------------------------
00 Black Shirt 100,- 500,-
------------------------------------------
01 Green Shirt 100,- 300,-
------------------------------------------
01 Black shoes 200,- 300,-
------------------------------------------
02 Black Shirt 150,- 150,-
------------------------------------------
就像您可以多次看到订单信息(orderId 和 OrderTotal)一样,但我只需要阅读一次。订单信息(产品名称和
价格)是独一无二的,我需要每一行。
当我创建一个订单列表时,我会这样做:
var processedOrderId = string.Empty();
var orderList = List<Order>();
while (reader.Read())
{
if (processedOrderId != reader["orderID"].ToString())
{
var order = new Order
{
OrderId = reader["orderID"] as string,
OrderTotal = reader["orderTotal"] as string
};
order.OrderLines = new List<OrderLine>();
orderList.Add(order);
}
var orderLine = new OrderLine
{
Name = reader["ProductName"] as string,
Price = reader["price"] as string
};
orderList[orderList.Count - 1].OrderLines.Add(orderLine);
processedOrderId = reader["orderID"].ToString();
}
当向 order 和 orderline 以及 ifs/elses 添加其他几个属性到方法时,它很快就会变得混乱。
我考虑过这样做:
var processedOrderId = string.Empty();
var orderList = List<Order>();
while (reader.Read())
{
if (processedOrderId != reader["orderID"].ToString())
{
var order = GetOrder(reader);
order.OrderLines = new List<OrderLine>();
orderList.Add(order);
}
var orderLine = GetOrderline(reader);
orderList[orderList.Count - 1].OrderLines.Add(orderLine);
processedOrderId = reader["orderID"].ToString();
}
我想避免过多调用数据库,但也考虑了以下几点:
var orderList = List<Order>();
while (reader.Read())
{
var order = GetOrder(reader);
order.OrderLines = GetOrderlinesForOrder(order.OrderId); // This calls a method that opens a new connection and read from the database etc
orderList[orderList.Count - 1].OrderLines.Add(orderLine);
}
这可以做不同的吗?这里的最佳做法是什么?
【问题讨论】:
-
你可以使用实体框架吗?
-
嗨@Win,我在 MVC 工作,但订单来自现有数据库
-
嗨@Win,我在主项目中使用 MVC 和我自己的数据库。但是订单被放置在另一个数据库中,我可以从中读取但不能更改/调制。我还能继续使用 EF 并做这样的事情吗:odetodata.com/2014/12/…
-
@Win 我最终使用了 MVC。实体框架代码优先到现有数据库:msdn.microsoft.com/en-us/library/jj200620(v=vs.113).aspx
标签: c# asp.net architecture