我想改进从订单数据库获取订单和订单项的方式。
我正在使用"使用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();
}
当添加了几个其他属性以及订单和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);
}
可以这样做吗?这里的最佳做法是什么?
答案 0 :(得分:1)
一般情况下,您应该有两个单独的数据库调用:一个用于订单详细信息,另一个用于获取给定订单的OrderLines。不仅因为这个特殊问题而且因为你一般都需要两者:例如,为了显示订单列表,你不需要行。
现在,那些测试和应用程序的使用方式发挥作用。如果您主要在订单上显示订单和总金额列表,并且很少订购,那么可以留下2个电话。另一方面,如果你出于某种原因看到它不够好,那么你可以尝试将两个db调用优化为一个。一种可能的方法是这样的:
while(reader.Read()) {
//read your order here
}
reader.NexResult();
while(reader.Read()) {
//read your orderlines here
//and assign them to order you have read earlier
}
这假设您的存储过程中有2个SELECT:一个用于订单,一个用于订单。
这是一个重复好思想的好地方:过早优化是万恶之源:)。
重要提示:当您调用connection.Open()时,通常并不意味着建立新连接。那是pooler为你做的连接。