我正在学习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会是什么样子?
答案 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
}
}