Saya punya koleksi produk
public class Product {
public Product() { }
public string ProductCode {get; set;}
public decimal Price {get; set; }
public string Name {get; set;}
}
Sekarang saya ingin mengelompokkan koleksi berdasarkan kode produk dan mengembalikan objek yang berisi nama, nomor atau produk untuk setiap kode dan total harga untuk setiap produk.
public class ResultLine{
public ResultLine() { }
public string ProductName {get; set;}
public string Price {get; set; }
public string Quantity {get; set;}
}
Jadi saya menggunakan GroupBy untuk mengelompokkan berdasarkan ProductCode, lalu saya menghitung jumlah dan juga menghitung jumlah catatan untuk setiap kode produk.
Inilah yang saya miliki sejauh ini:
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>();
Untuk beberapa alasan, jumlah tersebut dilakukan dengan benar tetapi hitungannya selalu 1.
Data sampel:
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" });
Hasil dengan data sampel:
Product1: count 1 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Produk 1 harus dihitung = 2!
Saya mencoba mensimulasikan ini dalam aplikasi konsol sederhana tetapi di sana saya mendapat hasil sebagai berikut:
Product1: count 2 - Price:13 (2x6.5)
Product1: count 2 - Price:13 (2x6.5)
Product2: count 1 - Price:12 (1x12)
Product1: hanya boleh dicantumkan sekali ... Kode untuk di atas dapat ditemukan di pastebin: http://pastebin.com/cNHTBSie
Price
desimal juga, dan kemudian mengubah cara Anda memformatnya. Jaga representasi data tetap bersih, dan hanya ubah ke tampilan presentasi pada saat terakhir yang memungkinkan.Kueri berikut berfungsi. Ini menggunakan setiap grup untuk melakukan pilih, bukan
SelectMany
.SelectMany
bekerja pada setiap elemen dari setiap koleksi. Misalnya, dalam kueri Anda, Anda memiliki hasil 2 koleksi.SelectMany
mendapatkan semua hasil, total 3, bukan setiap koleksi. Kode berikut berfungsi pada masing-masingIGrouping
bagian yang dipilih untuk membuat operasi agregat Anda berfungsi dengan benar.sumber
terkadang Anda perlu memilih beberapa bidang dengan
FirstOrDefault()
atausingleOrDefault()
Anda dapat menggunakan kueri di bawah ini:sumber
FirstOrDefault() or
singleOrDefault () `?