我有一系列产品

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>();

For some reason, the sum is done correctly but the count is always 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的计数应为2!

我试图在一个简单的控制台应用程序中模拟这一点,但结果如下:

Product1: count 2   - Price:13 (2x6.5)
Product1: count 2   - Price:13 (2x6.5)
Product2: count 1   - Price:12 (1x12)

产品1:应该只列出一次...

推荐答案

我不知道第一个"样本数据结果"是从哪里来的,但是控制台应用程序中的问题是您使用SelectMany来查看each item in each group.

我想你只是想:

List<ResultLine> result = Lines
    .GroupBy(l => l.ProductCode)
    .Select(cl => new ResultLine
            {
                ProductName = cl.First().Name,
                Quantity = cl.Count().ToString(),
                Price = cl.Sum(c => c.Price).ToString(),
            }).ToList();

这里使用First()来获取产品名称,假设具有相同产品代码的每个产品都具有相同的产品名称.正如注释中所指出的,您可以按产品名称和产品代码进行分组,如果任何给定代码的名称始终相同,则会得到相同的结果,但显然在EF中生成更好的SQL.

我还建议您将QuantityPrice属性分别更改为intdecimal类型——为什么要对显然不是文本的数据使用字符串属性?

.net相关问答推荐

在 .NET 7 项目上设置 Sentry 时遇到问题

与 Datagrid 的 SelectedItem 链接时的 WPF RadioButton 绑定问题

使用 Powershell TOM 在 SSAS 表格中创建分区

如何使用 Moq 为不同的参数设置两次方法

log4net 与 TraceSource

不同命名空间中的部分类

控制台应用程序的退出时

如何从字符串中删除所有字母字符?

使用 C# 在 .NET 4.0 中 Task.Run 的替代方法是什么?

C# 的浮点比较函数

从 .NET 中的字符串末尾修剪字符串 - 为什么会丢失?

寻找 .NET 的命令行参数解析器

如何使用配置转换删除 ConnectionString

ReaderWriterLockSlim 什么时候比简单的锁更好?

让 String.Replace 只打整个单词的方法

判断 .NET 中的目录和文件写入权限

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

如何获取当前的 ProcessID?

在 Windows 窗体 C# 应用程序中拥有配置文件的最简单方法

使用没有catch块的try-finally块