如何合并这三个LINQ查询?合并后能提升3倍速度吗?
合并LINQ聚合查询的优化方案
怎么把三个LINQ语句合并成一个?
你可以通过一次查询让数据库同时计算出三个聚合值,避免多次来回调用数据库。这里有两种靠谱的实现方式:
方式一:数据库端聚合(推荐)
直接让数据库将过滤后的数据归为一组,一次性完成所有聚合计算,代码如下:
var aggregateResult = await Items .GroupBy(_ => 1) // 将所有符合条件的数据归为同一组 .Select(group => new { ItemsCount = group.Count(), TotalQTY = group.Sum(item => item.IntegerQuantity), TotalPrice = group.Sum(item => item.IntegerQuantity * item.ApproximateCost) }) .FirstOrDefaultAsync(); // 组装结果对象 InventoryTotals inventoryTotals = new() { NumberOfItems = aggregateResult?.ItemsCount ?? 0, TotalQuantity = aggregateResult?.TotalQTY ?? 0, TotalApproximatePrice = aggregateResult?.TotalPrice ?? 0m };
方式二:客户端聚合(仅作参考,不推荐)
如果因特殊场景不想用GroupBy,也可以先筛选出需要的字段,在应用端完成聚合,但这种方式会传输中间数据到程序,效率不如数据库端聚合:
var aggregateResult = await Items .Select(item => new { Count = 1, Quantity = item.IntegerQuantity, Price = item.IntegerQuantity * item.ApproximateCost }) .AggregateAsync( seed: new { TotalCount = 0, TotalQuantity = 0, TotalPrice = 0m }, (accumulator, current) => new { TotalCount = accumulator.TotalCount + current.Count, TotalQuantity = accumulator.TotalQuantity + current.Quantity, TotalPrice = accumulator.TotalPrice + current.Price } ); InventoryTotals inventoryTotals = new() { NumberOfItems = aggregateResult.TotalCount, TotalQuantity = aggregateResult.TotalQuantity, TotalApproximatePrice = aggregateResult.TotalPrice };
合并后速度会更快吗?能达到3倍速吗?
- 速度肯定会提升:原来的代码要发起三次独立的数据库请求,每次都要经历网络往返、SQL解析、查询执行、结果返回的完整流程。合并后只需要一次请求,直接省掉了两次完整的往返开销,在网络延迟高或数据库负载大的场景下,提升会很明显。
- 但严格的3倍速基本不可能:三次查询本质都是扫描同一批过滤后的数据,数据库执行聚合的时间不会直接除以3。合并后的查询只需要扫描一次数据就能算出三个聚合值,所以执行时间和单次聚合查询相差不大,主要节省的是网络和SQL解析的时间。如果是本地数据库,网络开销几乎为零,提升幅度会小一些,但依然比三次查询高效。
内容的提问来源于stack exchange,提问作者browsermator
相关产品推荐
相关产品推荐

