Bestpractice与订单行一起获取订单

时间:2017-07-10 21:29:40

标签: c# asp.net architecture

我想改进从订单数据库获取订单和订单项的方式。

我正在使用"使用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);

}

可以这样做吗?这里的最佳做法是什么?

1 个答案:

答案 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为你做的连接。