【问题标题】:How to calculate sum for specific property without grouping main list data如何在不分组主列表数据的情况下计算特定属性的总和
【发布时间】:2020-05-07 10:40:25
【问题描述】:

我正在从数据库中获取发票,我想返回所有发票而不将它们分组!

我不想将它们分组,因为如果有 100 张发票,我想将它们全部退回 100,考虑到我想获得金额总和。

因此,如果多张发票的总和相同,则重复相同的总计是完全可以的,所以基本上 我想通过 CompanyId、PackageId、BankId 计算每个发票项目和组的总和, PayMethod 仅在可能的情况下?

-- 读取代码cmets--

var result = await _dbContext.Invoices
                       .Where(p => p.CheckDate >= startDate && p.CheckDate <= endDate)
                       .Select(p => new DemoDto()
                       {
                           CompanyId = p.CompanyId,
                           Title = p.Title,
                           Price = p.Price
                           Total = p.Sum(p => p.Amount).ToString(), // Can I sum here and group by fields I mentioned above? without grouping all data set because I want to keep all 100 records if I received all 100 from database
                       })
                       .ToListAsync();

这个查询不经意地不起作用,因为它说

发票不包含 Sum 的定义并且没有可访问的方法..

DemoDto 看起来像这样:

public class DemoDto
{
  public string CompanyId {get;set;}
  public string Title {get;set;}
  public decimal Price {get;set;}
  public decimal Amount {get;set;}
}

发票类如下所示:

public class Invoice
{
    public string CompanyId { get; set; }
    public int PackageId {get; set;}
    public int BankId {get;set;}
    public int PayMethod {get;set;}
    public string Title { get; set; }
    public decimal Price { get; set; }
    public decimal Amount { get; set; }
}

我在这里缺少什么?

我怎样才能做到这一点?

谢谢大家 干杯

【问题讨论】:

  • 这个语句如何我不想将它们分组与这个存在我想计算每个发票项目的总和并按CompanyId,PackageId分组, BankId, PayMethod?
  • 没有理由在每个实体中存储所有实体的总和
  • 您可以通过计算 Total 列的总和来分组并在分组后获取相同的列表。像这样的方法:productPrices.GroupBy(p =&gt; p.ProductId) .SelectMany(x =&gt; x.Select(y =&gt; new ProductPrices { ProductId = y.ProductId, VendorId = y.VendorId, Price = y.Price, Total = x.Sum(z =&gt; z.Price) }))
  • @Sajid 你能在我的代码中应用你的解决方案吗?我想知道如何修改我的代码以应用你写的内容?非常感谢萨吉德!
  • @Roxy'Pro,我可以申请,所以对于你的情况,我们将按 CompanyId、PackageId、BankId、PayMethod 分组?

标签: c# linq group-by sum


【解决方案1】:
  1. 从数据库中获取所有发票:

    var invoices = await _dbContext.Invoices
                     .Where(p => p.CheckDate >= startDate && p.CheckDate <= endDate)
                     .ToListAsync();
    
  2. 使用 Linq-To-Object 对内存中的结果进行分组:

    var result = invoices?
                     .GroupBy(p => new { p.CompanyId, p.PackageId, p.BankId, p.PayMethod })
                     .SelectMany(x => x.Select(y =>
                         new DemoDto
                         {
                             CompanyId = y.CompanyId,
                             Title = y.Title,
                             Price = y.Price,
                             Total = x.Sum(z => z.Price)
                         }))
                     .ToList();
    

如果您出于某种原因想要在数据库中执行分组,您应该执行原始 SQL 查询或存储过程,而不是依赖 ORM 为您生成一些神奇的(而且很可能是低效的)查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2015-12-02
    • 2020-11-26
    • 2017-05-16
    • 2022-10-13
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多