RavenDB索引Reduce部分平均计算语法问题求助
解决RavenDB索引中平均值计算的语法问题
我来帮你搞定这个平均值计算的问题!你遇到的核心问题是在Reduce的select块里,没法直接引用同一层级刚定义的totalPrice和areaCount——因为这些字段在此时还没完成初始化,LINQ解析器自然识别不了它们。
修正后的完整索引代码
先给你直接上可以正常运行的代码:
// Map部分保持不变 Map: from area in docs.Level5_AdministrativeAreas select new { area.NAME_4, totalPrice = area.pricePerSquareMetre, areaCount = 1, priceAverage = 0 } // 修正后的Reduce部分 Reduce: from result in results group result by new { result.NAME_4 } into g // 先把聚合结果存为临时变量 let total = g.Sum(x => x.totalPrice) let count = g.Sum(x => x.areaCount) select new { NAME_4 = g.Key.NAME_4, totalPrice = total, areaCount = count, // 直接用临时变量计算平均值,同时处理除数为0的边界情况 priceAverage = count == 0 ? 0 : total / count }
关键说明
- 用
let创建中间变量:通过let关键字提前计算并存储分组后的总价总和和数量,这样在后续的select块里就能直接引用这些变量来计算平均值,完美避开了同一层级字段未初始化的问题。 - 处理除数为0的边界情况:我加了
count == 0 ? 0 : total / count的判断,防止某个分组没有数据时出现除以0的错误,让索引更健壮。
之前你尝试用g.totalPrice之类的写法无效,是因为g是分组后的结果集,它本身并没有totalPrice这个属性——totalPrice是你在select里要生成的字段,不是分组集合的固有属性。
内容的提问来源于stack exchange,提问作者Hiro Protagonist
相关产品推荐
相关产品推荐

