Eu tenho uma coleção de produtos
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Agora, quero agrupar a coleção com base no código do produto e retornar um objeto que contenha o nome, o número ou produtos de cada código e o preço total de cada produto.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Então, eu uso um GroupBy para agrupar por ProductCode, calculo a soma e também conto o número de registros para cada código de produto.
Isto é o que eu tenho até agora:
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>();
Por alguma razão, a soma é feita corretamente, mas a contagem é sempre 1.
Dados 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" });
Resultado com dados de amostra:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
O produto 1 deve ter count = 2!
Tentei simular isso em um aplicativo simples de console, mas obtive o seguinte resultado:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produto1: deve ser listado apenas uma vez ... O código para o anterior pode ser encontrado em pastebin: http://pastebin.com/cNHTBSie
Price
um decimal e depois alterar a formatação. Mantenha a representação de dados limpa e altere apenas para uma exibição de apresentação no último momento possível.A consulta a seguir funciona. Ele usa cada grupo para fazer a seleção em vez de
SelectMany
.SelectMany
funciona em cada elemento de cada coleção. Por exemplo, na sua consulta, você tem um resultado de 2 coleções.SelectMany
obtém todos os resultados, um total de 3, em vez de cada coleção. O código a seguir funciona em cadaIGrouping
parte da seleção para que suas operações agregadas funcionem corretamente.fonte
Às vezes, você precisa selecionar alguns campos
FirstOrDefault()
ousingleOrDefault()
pode usar a consulta abaixo:fonte
FirstOrDefault() or
singleOrDefault () `?