Linq 加入 GroupBy 和 Sum

Linq Join with GroupBy and Sum

我有 table 个交易和 table 个客户,如下所示:

public class Customer
{    
    public string Id{ get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
 }

public class SalesTransaction
{
    public int Id { get; set; }

    public decimal Amount { get; set; }
    public string CustomerId{ get; set; }
}

现在我需要获取每个客户的交易总金额列表,并在列表中显示客户名称和总交易金额

我尝试了以下 linq 方法语法

await _context.SalesTransactions
            .GroupBy(w=>w.CustomerId)
            .OrderByDescending(g=>g.Sum(t=>t.Amount))
            .ToListAsync();

但是当我尝试 运行 时,出现以下错误

InvalidOperationException: Client side GroupBy is not supported.

我也试过下面的查询语法

var TransactionSummary = await (from w in _context.WalletTransactions
                           //join c in _context.Customers 
                            on w.CustomerId equals c.Id
                            group w by w.CustomerId
                            into ct
                            //from c in ct.DefaultIfEmpty()
                            select new
                            {
                             ID=ct.Key,
                             TransactionAmount=ct.Sum(a=>a.Amount),
                            // ct.Name
                             }).ToListAsync();

但是 Sum(w.Amount) 显示错误,指出“Sum 在当前上下文中不存在”。

我也不确定在查询语法中的什么地方放置分组子句来实现分组 Customer.Id 字段的结果。

请注意,我注释掉的行是我想添加的子句,但不确定在何处以及如何以正确的方式添加它们

我希望找到解决这个问题的正确方法。

谢谢

已找到解决方案: 感谢@Asherguru

的回答

我只需要稍微修改一下就可以达到预期的效果

以下有效

var transactions= (await _context.SalesTransactions.Include(x => x.Sender).ToListAsync())
            .GroupBy(w => new { w.CustomerId, w.Sender })
            .Select(x => new 
            {
                CustomerID= x.Key.CustomerId,
                 x.Key.Customer,
                Amount = x.Sum(w => w.Amount)
            }).ToList();

试试这个。

await _context.SalesTransactions
        .GroupBy(w => w.CustomerId)
        .Select(x => new SalesTransactions() 
        {
            CustomerId = x.Key,
            Amount = x.Sum(w => w.Amount)
        }).ToListAsync();

已编辑 2

await _context.SalesTransactions.Include(x => x.Customer).ToListAsync()
    .GroupBy(w => new { w.CustomerId, w.Customer })
    .Select(x => new SalesTransactions() 
    {
        CustomerId = x.Key.CustomerId,
        Customer = x.Key.Customer,
        Amount = x.Sum(w => w.Amount)
    }).ToListAsync();

可以从 SalesTransaction Customer.Name 中获取名称 class。