Tengo una coleccion de productos
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Ahora quiero agrupar la colección en función del código del producto y devolver un objeto que contenga el nombre, el número o los productos de cada código y el precio total de cada producto.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Entonces uso un GroupBy para agrupar por ProductCode, luego calculo la suma y también cuento el número de registros para cada código de producto.
Esto es lo que tengo hasta ahora:
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 alguna razón, la suma se realiza correctamente pero el recuento siempre es 1.
Datos de 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 con datos de muestra:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
¡El producto 1 debería tener count = 2!
Intenté simular esto en una aplicación de consola simple, pero allí obtuve el siguiente resultado:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Producto1: solo debe aparecer una vez ... El código de lo anterior se puede encontrar en pastebin: http://pastebin.com/cNHTBSie
Price
como decimal y luego cambiar la forma en que lo formatea. Mantenga limpia la representación de datos y solo cambie a una vista de presentación en el último momento posible.La siguiente consulta funciona. Utiliza cada grupo para hacer la selección en lugar de
SelectMany
.SelectMany
trabaja en cada elemento de cada colección. Por ejemplo, en su consulta tiene un resultado de 2 colecciones.SelectMany
obtiene todos los resultados, un total de 3, en lugar de cada colección. El siguiente código funciona en cada unoIGrouping
en la parte seleccionada para que sus operaciones agregadas funcionen correctamente.fuente
a veces necesita seleccionar algunos campos por
FirstOrDefault()
osingleOrDefault()
puede usar la siguiente consulta:fuente
FirstOrDefault() or
singleOrDefault () `?