【问题标题】:Bestpractice fetching orders together with orderlines与有序一起获取订单的最佳实践
【发布时间】: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


【解决方案1】:

您通常应该有 2 个单独的数据库调用:一个用于订单详细信息,一个用于获取给定订单的 OrderLines。不仅因为这个特殊问题,而且因为您通常需要两者:例如,为了显示订单列表,您不需要行。

现在,这就是测试和您的应用使用方式发挥作用的地方。如果您主要在 Order 上显示订单列表和总金额,而很少安排订单,那么留下 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() 时,通常并不意味着正在建立新连接。这就是连接池为您做的事情。

【讨论】:

  • 嗨@dee zg 这正是我正在寻找的输入 - 一些代码和一些想法。谢谢 - 有一个美好的夏天:)
  • @LasseBj 很高兴你发现它有用;)
猜你喜欢
  • 2018-04-19
  • 2011-12-13
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多