Как уже упоминалось в комментариях, вам нужно отслеживать, каких клиентов вы уже видели, помещая их в словарь, используя CustomerId
в качестве ключа. Вот базовый c подход:
Для каждой прочитанной записи сначала получите CustomerId
из считывателя и проверьте, есть ли этот клиент уже в словаре. Если это так, то получите этот объект customer из словаря; в противном случае создайте нового читателя из читателя и добавьте его в словарь. Затем получите данные о продукте от читателя, создайте новый продукт и добавьте продукт в список продуктов клиента.
Вот как это может выглядеть в коде:
var customersById = new Dictionary<int, Customer>();
while (reader.Read())
{
int customerId = (int)reader["CustomerId"];
Customer customer;
if (!customersById.TryGetValue(customerId, out customer))
{
customer = new Customer
{
CustomerId = customerId,
Name = (string)reader["CustomerName"],
City = (string)reader["City"],
Products = new List<Product>()
};
customersById.Add(customerId, customer);
}
Product product = new Product
{
CustomerId = customerId,
ProductId = (int)reader["ProductId"],
Name = (string)reader["ProductName"],
Quantity = (int)reader["Quantity"]
};
customer.Products.Add(product);
}
Затем вы можете выгружать данные следующим образом:
Console.WriteLine("Product list by customer:\n");
foreach (Customer cust in customersById.Values)
{
Console.WriteLine(string.Format("{0}) {1} of {2}", cust.CustomerId, cust.Name, cust.City));
foreach (Product prod in cust.Products)
{
Console.WriteLine(string.Format("\t{0}) {1} (qty {2})", prod.ProductId, prod.Name, prod.Quantity));
}
Console.Writeline();
}
Fiddle: https://dotnetfiddle.net/iO9vdM