У меня есть коллекция товаров
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Теперь я хочу сгруппировать коллекцию на основе кода продукта и вернуть объект, содержащий имя, номер или продукты для каждого кода и общую цену для каждого продукта.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Поэтому я использую GroupBy для группировки по ProductCode, затем вычисляю сумму, а также подсчитываю количество записей для каждого кода продукта.
Вот что у меня есть на данный момент:
List<Product> Lines = LoadProducts();
List<ResultLine> result = Lines
.GroupBy(l => l.ProductCode)
.SelectMany(cl => cl.Select(
csLine => new ResultLine
{
ProductName =csLine.Name,
Quantity = cl.Count().ToString(),
Price = cl.Sum(c => c.Price).ToString(),
})).ToList<ResultLine>();
По какой-то причине сумма сделана правильно, но счет всегда равен 1.
Данные Sampe:
List<CartLine> Lines = new List<CartLine>();
Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" });
Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" });
Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" });
Результат с образцами данных:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
У продукта 1 должно быть count = 2!
Я попытался смоделировать это в простом консольном приложении, но получил следующий результат:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Продукт1: следует указывать только один раз ... Код для вышеуказанного можно найти на pastebin: http://pastebin.com/cNHTBSie
Price
в десятичном формате, а затем изменить его форматирование. Следите за чистотой представления данных и переходите к представлению презентации только в последний момент.Следующий запрос работает. Он использует каждую группу для выбора вместо
SelectMany
.SelectMany
работает над каждым элементом из каждой коллекции. Например, в вашем запросе у вас есть результат 2 коллекций.SelectMany
получает все результаты, всего 3, вместо каждой коллекции. Следующий код работает с каждымIGrouping
в выбранной части, чтобы ваши агрегированные операции работали правильно.источник
иногда вам нужно выбрать некоторые поля
FirstOrDefault()
илиsingleOrDefault()
вы можете использовать следующий запрос:источник
FirstOrDefault() or
singleOrDefault () `?