单个SQL查询选择所有客户以及属于每个客户的所有订单?

时间:2018-06-26 10:28:31

标签: sql-server c#

我正在学习SQL,突然间我想到了这个问题。鉴于我有.NET类来表示客户和订单,如下所示:

public class ListCustomers
{
    public List<Customers> MyBigList {get; set;}
    public ListCustomers()
    {
        // some code to query database
    }
}

public class Customers
{
    public int CustomerID {get; set;}
    public String CustomerName {get; set;}
    public String CustomerEmail {get; set;}
    public String CustomerPhone {get; set;}
    public List<Orders> CustomerOrders {get; set;}
}

public class Orders
{
    public int OrderID {get; set;}
    public double OrderTotalAmount {get; set;}
    public String BillingAddress {get; set;}
    public String ShippingAddress {get; set;}
}

通常我会先选择所有客户,然后在我的代码中使用foreach循环选择订单以填充每个List<Orders> CustomerOrders属性。

但是,这需要多次访问SQL Server,我想知道是否有任何方法可以仅使用一次SQL来填充整个List<Customers> MyBigList类?在这种情况下,结果的DataSet / DataTable会是什么样子?

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点。

我不确定如何返回SQL,但是如果使用

  

SqlCommand.ExecuteReader()

一种方法是为每个已加载的客户加载属于该客户的所有订单,但是每个客户都要经过一次SQL之旅才能获得他们的订单。

 public LoadCustomers()
{
    // some code to query database
   // some code to handle the data and add to your list
     while (SQLdta.Read()){
         Customers customer = new Customers();
         customer.CustomerOrders = loadCustomerOrders();
         MyBigList.Add(this);
     }
}

选项2-另一种可能的解决方案是创建需要订购的客户列表,并一站式获取所有订单,并将其与各自的客户进行匹配。 至少两次SQL命中...

选项3-我认为有些混乱,但可能最适合您的需求。 创建拖车SQL查询 作为一次SQL命中执行。

例如

SELECT CustomerID,CustomerName,CustomerEmail,CustomerPhone 
FROM Customers 
WHERE (YOUR WHERE STRING GOES HERE);

然后再次查询订单

SELECT OrderID,OrderTotalAmount,BillingAddress,ShippingAddress 
FROM Orders 
WHERE (YOUR ORDERS WHERE STRING GOES HERE) 
AND CustomerID IN ( SELECT CustomerID FROM Customers WHERE (YOUR WHERE STRING GOES HERE));

两者都将发送到SQL,您将一起执行查询,并返回2个结果表

因此,在您的班级中,您可以执行以下操作。

    //Your SQL query execution code

    //Reads your Customers First
    while (SQLdta.Read())
    {
      //Your logic to populate your customers list
    }

    //Move the reader to the next returned results table and read the orders
    while (SQLdta.NextResult())
    {
      while (SQLdta.Read())
      {
       //Your logic to populate your orders list
      }
    }

此时,您将有2个列表,然后可以将订单链接到您的客户

如果您坚持使用数据集,那么它的工作原理相同,只是数据集中的每个表都是您单独的SQL查询结果。

    if ((dataSet != null) && (dataSet.Tables != null) && (dataSet.Tables.Count > 0))
            {
                foreach (DataTable d in dataSet.Tables)
                {
                    //your code to handle each tables data
                }
            }