Я хочу создать список CustomerOrder
и сгруппировать quantity
по item_id
. Код почти работает, но не группируется по item_id
.
Я тоже думаю что-то не так с производительностью / использованием памяти. Он работает, когда общий размер списка составляет ~ 1000, но когда он достигает ~ 30 000, возникают проблемы с памятью.
Я подозреваю, что проблема связана с «выбором нового клиента». Вероятно, мне не следует использовать ToList()
, я не мог сделать это как IEnumerable. Я думал, что GroupJoin
будет путем к go, но я тоже не могу заставить это работать. В примере, который я нашел с использованием группового соединения, было значение «внешнего ключа» в дочерней таблице, у меня его нет.
public class CustomerOrder
{
public int order_id { get; set; }
public List<OrderLine> OrderLines { get; set; }
}
public class OrderLine
{
public int item_id { get; set; }
public int quantity { get; set; }
}
public class Program
{
public static void Main()
{
List<CustomerOrder> list1 = new List<CustomerOrder>()
{new CustomerOrder{order_id = 1, OrderLines = new List<OrderLine>()
{new OrderLine()
{item_id = 123, quantity = 2}, new OrderLine()
{item_id = 456, quantity = 3}}}};
List<CustomerOrder> list2 = new List<CustomerOrder>()
{new CustomerOrder{order_id = 1, OrderLines = new List<OrderLine>()
{new OrderLine()
{item_id = 456, quantity = 2}, new OrderLine()
{item_id = 789, quantity = 3}}}};
var orderdetails =
from g in list1.Concat(list2).GroupBy(x => x.order_id) select new CustomerOrder { order_id = g.Key, OrderLines = g.SelectMany(x => x.OrderLines).ToList() };
foreach (var item in orderdetails)
{
Console.WriteLine(item.order_id);
foreach (var line in item.OrderLines)
{
Console.WriteLine("{0} {1}", line.item_id, line.quantity);
}
}
}
}
Текущий вывод:
1
123 2
456 3
456 2
789 3
My желаемый результат:
1
123 2
456 5
789 3
Каждый список должен быть уникальным на основе order_id
, но будет перекрытие в терминах order_lines
. Один список почти всегда будет значительно больше другого. Коэффициент текущей ликвидности составляет 29 500: 500 для выборки 30 000.