From 00eec47e13750c2bfc890b84d603d578f36ef10c Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 7 Nov 2023 13:27:49 +0100 Subject: [PATCH] DeliveryAdminWindow: let linq calculate aggregate functions in the database --- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 92 ++++++++++++++--------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 2786790..114416d 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -599,59 +599,83 @@ namespace Elwig.Windows { AddToolTipCell(StatusGradationToolTip, "⌀", 0, 3, 1, false, false, true); AddToolTipCell(StatusGradationToolTip, "max.", 0, 4, 1, false, false, true); AddGradationToolTipRow(1, "Gradation", null, kmwMin, kmwAvg, kmwMax); - } else { - StatusGradation.Text = "Gradation: -"; - } - if (n > 0 && (n <= 200 || TodayOnlyInput.IsChecked == true)) { - var parts = await deliveryParts.ToListAsync(); - var attrGroups = parts - .GroupBy(p => p.Attribute?.Name) - .Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw))) - .OrderByDescending(g => g.Item2) - .ThenBy(g => g.Key) - .ToList(); - var groups = parts - .GroupBy(p => (p.Attribute?.Name, p.SortId)) - .Select(g => (g.Key.Name, g.Key.SortId, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw))) - .OrderByDescending(g => g.SortId) - .ThenBy(g => g.Name) + var attrGroups = await deliveryParts + .GroupBy(p => p.Attribute.Name) + .Select(g => new { + Attr = g.Key, + Weight = g.Sum(p => p.Weight), + Min = g.Min(p => p.Kmw), + Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight), + Max = g.Max(p => p.Kmw), + }) + .OrderByDescending(g => g.Weight) + .ThenBy(g => g.Attr) + .ToListAsync(); + var sortGroups = await deliveryParts + .GroupBy(p => p.SortId) + .Select(g => new { + SortId = g.Key, + Weight = g.Sum(p => p.Weight), + Min = g.Min(p => p.Kmw), + Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight), + Max = g.Max(p => p.Kmw), + }) + .OrderByDescending(g => g.Weight) .ThenBy(g => g.SortId) - .ToList(); + .ToListAsync(); + var groups = await deliveryParts + .GroupBy(p => new { + p.Attribute.Name, + p.SortId, + }) + .Select(g => new { + Attr = g.Key.Name, + g.Key.SortId, + Weight = g.Sum(p => p.Weight), + Min = g.Min(p => p.Kmw), + Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight), + Max = g.Max(p => p.Kmw) + }) + .OrderByDescending(g => g.SortId) + .ThenBy(g => g.Attr) + .ThenBy(g => g.SortId) + .ToListAsync(); int rowNum = 1; foreach (var attrG in attrGroups) { rowNum++; - AddWeightToolTipRow(rowNum++, attrG.Key, null, attrG.Item2, attrG.Item2, weight); - AddGradationToolTipRow(rowNum, attrG.Key, null, attrG.Item3, attrG.Item4, attrG.Item5); - foreach (var g in groups.Where(g => g.Name == attrG.Key).OrderByDescending(g => g.Item3).ThenBy(g => g.SortId)) { - AddWeightToolTipRow(rowNum++, null, g.SortId, g.Item3, attrG.Item2, weight); - AddGradationToolTipRow(rowNum, null, g.SortId, g.Item4, g.Item5, g.Item6); + AddWeightToolTipRow(rowNum++, attrG.Attr, null, attrG.Weight, attrG.Weight, weight); + foreach (var g in groups.Where(g => g.Attr == attrG.Attr).OrderByDescending(g => g.Weight).ThenBy(g => g.SortId)) { + AddWeightToolTipRow(rowNum++, null, g.SortId, g.Weight, attrG.Weight, weight); + } + } + rowNum = 2; + foreach (var attrG in attrGroups) { + rowNum++; + AddGradationToolTipRow(rowNum++, attrG.Attr, null, attrG.Min, attrG.Avg, attrG.Max); + foreach (var g in groups.Where(g => g.Attr == attrG.Attr).OrderByDescending(g => g.Avg).ThenBy(g => g.SortId)) { + AddGradationToolTipRow(rowNum++, null, g.SortId, g.Min, g.Avg, g.Max); } } if (attrGroups.Count == 1) { - var g = attrGroups.First().Key; + var g = attrGroups.First().Attr; if (g != null) { StatusWeight.Text += $" [{g}]"; StatusGradation.Text += $" [{g}]"; } - - var sortGroups = parts - .GroupBy(p => p.SortId) - .Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw))) - .OrderByDescending(g => g.Item2) - .ToList(); - if (sortGroups.Count > 1 && sortGroups.Count <= 4) { - StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}"; - StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}"; + StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Weight:N0} kg ({(double)g.Weight / weight:0%})" + (g.SortId == null ? "" : $" [{g.SortId}]")))}"; + StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Min:N1}/{g.Avg:N1}/{g.Max:N1}" + (g.SortId == null ? "" : $" [{g.SortId}]")))}"; } } else if (attrGroups.Count <= 4) { - StatusWeight.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}"; - StatusGradation.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}"; + StatusWeight.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Weight:N0} kg ({(double)g.Weight / weight:0%})" + (g.Attr == null ? "" : $" [{g.Attr}]")))}"; + StatusGradation.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Min:N1}/{g.Avg:N1}/{g.Max:N1}" + (g.Attr == null ? "" : $" [{g.Attr}]")))}"; } + } else { + StatusGradation.Text = "Gradation: -"; } } else { StatusVarieties.Text = "Sorten: -";