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。
我有 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。