在Entity Framework Core (EF Core)中,可以使用LINQ查询语法或方法语法来执行包含聚合函数(如SUM和COUNT)以及分组操作(GROUP BY)的SQL查询。
// 计算每个订单的总金额减去折扣金额的总和
var result = context.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new {
CustomerId = g.Key,
TotalNetAmount = g.Sum(o => o.TotalAmount - o.DiscountAmount)
})
.ToList();
// 计算每个客户的高价值订单数量(金额大于1000)
var result = context.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new {
CustomerId = g.Key,
HighValueOrderCount = g.Count(o => o.TotalAmount > 1000)
})
.ToList();
// 计算每个产品类别的平均销售额和订单数量
var result = context.OrderDetails
.GroupBy(od => od.Product.Category)
.Select(g => new {
Category = g.Key,
TotalSales = g.Sum(od => od.Quantity * od.UnitPrice),
OrderCount = g.Count(),
AverageSale = g.Average(od => od.Quantity * od.UnitPrice)
})
.ToList();
原因:复杂的聚合查询可能导致性能下降,特别是处理大量数据时。
解决方案:
var result = context.Orders
.FromSqlRaw("SELECT CustomerId, SUM(TotalAmount - DiscountAmount) AS TotalNetAmount FROM Orders GROUP BY CustomerId")
.AsNoTracking()
.ToList();
原因:如果x或y为NULL,SUM(x-y)可能返回意外结果。
解决方案:
var result = context.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new {
CustomerId = g.Key,
TotalNetAmount = g.Sum(o => (o.TotalAmount ?? 0) - (o.DiscountAmount ?? 0))
})
.ToList();
原因:EF Core在分组后可能无法自动加载导航属性。
解决方案:
var result = context.OrderDetails
.Include(od => od.Product) // 包含导航属性
.GroupBy(od => od.Product.Category)
.Select(g => new {
Category = g.Key,
TotalSales = g.Sum(od => od.Quantity * od.UnitPrice)
})
.ToList();
var result = context.Orders
.GroupBy(o => new { o.CustomerId, o.Year })
.Select(g => new {
g.Key.CustomerId,
g.Key.Year,
TotalAmount = g.Sum(o => o.TotalAmount)
})
.ToList();
var result = context.Orders
.GroupBy(o => o.CustomerId)
.Where(g => g.Sum(o => o.TotalAmount) > 10000)
.Select(g => new {
CustomerId = g.Key,
TotalAmount = g.Sum(o => o.TotalAmount)
})
.ToList();
通过合理使用这些技术,可以在EF Core中高效地执行复杂的聚合和分组查询。