带总和的 LINQ GroupBy
LINQ GroupBy with Sum
我正在尝试使用 LINQ 查询获取客户最受欢迎的产品(按数量订购最多)。当我 运行 这个 SQL 查询时,我得到了正确的结果:
SELECT TOP(15) i.ProductId, p.Description, Sum(i.Quantity) As QuantityOrdered
FROM Orders o
INNER JOIN OrderItems i ON o.Id = i.OrderId
INNER JOIN Products p ON i.ProductId = p.Id
WHERE o.ClientId = 19
GROUP BY ProductId, Description
ORDER BY QuantityOrdered DESC
它给了我正确的结果:
我正在尝试使用 LINQ 复制这些结果,这是我目前的结果:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.Select(group => group.Sum(item => item.Quantity))
.Take(15);
我得到的只是一个总和列表,但我不知道如何包含产品 ID 和描述。其次,我如何包含 OrderBy 以便首先出现最高金额?
您需要在 Select
投影中投影 ProductId
和 Description
以及 Sum()
:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.Select(group =>
new {
ProductId = group.Key,
Description = group.First().Description,
Sum = group.Sum(item => item.Quantity)
})
.OrderByDescending(i => i.Sum)
.Take(15);
组密钥是 ProductId
所以我们可以用它来投影密钥。 Description
我们需要从组中的第一个项目中获取。
试试这个:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.OrderByDescending(group => group.Sum(item => item.Quantity))
.Take(15);
我也不明白你为什么要分组?如果您对每个产品都有一个记录,那么您需要做的就是:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.OrderByDescending(product => product.Quantity)
.Take(15);
我正在尝试使用 LINQ 查询获取客户最受欢迎的产品(按数量订购最多)。当我 运行 这个 SQL 查询时,我得到了正确的结果:
SELECT TOP(15) i.ProductId, p.Description, Sum(i.Quantity) As QuantityOrdered
FROM Orders o
INNER JOIN OrderItems i ON o.Id = i.OrderId
INNER JOIN Products p ON i.ProductId = p.Id
WHERE o.ClientId = 19
GROUP BY ProductId, Description
ORDER BY QuantityOrdered DESC
它给了我正确的结果:
我正在尝试使用 LINQ 复制这些结果,这是我目前的结果:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.Select(group => group.Sum(item => item.Quantity))
.Take(15);
我得到的只是一个总和列表,但我不知道如何包含产品 ID 和描述。其次,我如何包含 OrderBy 以便首先出现最高金额?
您需要在 Select
投影中投影 ProductId
和 Description
以及 Sum()
:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.Select(group =>
new {
ProductId = group.Key,
Description = group.First().Description,
Sum = group.Sum(item => item.Quantity)
})
.OrderByDescending(i => i.Sum)
.Take(15);
组密钥是 ProductId
所以我们可以用它来投影密钥。 Description
我们需要从组中的第一个项目中获取。
试试这个:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.GroupBy(oi => oi.ProductId)
.OrderByDescending(group => group.Sum(item => item.Quantity))
.Take(15);
我也不明白你为什么要分组?如果您对每个产品都有一个记录,那么您需要做的就是:
var query = _context.Set<OrderItem>()
.Where(oi => oi.Order.ClientId == input.ClientId)
.OrderByDescending(product => product.Quantity)
.Take(15);