c# - Reduce 不能在分组中包含 Average() 方法

标签 c# .net ravendb

刚刚升级到 v2,这不再有效;如果我尝试使用 Count(),我会遇到类似的错误

public class Deck_Ratings : AbstractIndexCreationTask<DeckRating, Deck_Ratings.ReduceResult>
{
    public class ReduceResult
    {
        public string DeckId { get; set; }
        public int Rating { get; set; }
    }

    public Deck_Ratings()
    {
        Map = deckRatings => deckRatings.Select(deckRating => new 
                             { 
                                 deckRating.DeckId, 
                                 deckRating.Rating 
                             });
        Reduce = reduceResults => reduceResults
                                      .GroupBy(reduceResult => reduceResult.DeckId)
                                      .Select(grouping => new 
                                              {
                                                  DeckId = grouping.Key, 
                                                  Rating = grouping.Average(reduceResult => reduceResult.Rating)
                                               });
    }
}

最佳答案

禁止使用可能受减少批量大小影响的聚合(例如计数和平均),因为它们会产生错误的结果。你可能已经能够在 1.0 下使用它,但你的平均值可能是错误的,除非你的项目太少以至于它们都在一个减少批处理中完成。要了解有关减少批处理的更多信息,请阅读 Map / Reduce - A Visual Explanation

您必须通过对每个项目求和 1 来计算项目。您必须通过将值的总和作为总数,将 1 的总和作为计数,然后除以它们来对项目进行平均。

public class Deck_Ratings : AbstractIndexCreationTask<DeckRating, Deck_Ratings.ReduceResult>
{
    public class ReduceResult
    {
        public string DeckId { get; set; }
        public int TotalRating { get; set; }
        public int CountRating { get; set; }
        public double AverageRating { get; set; }
    }

    public Deck_Ratings()
    {
        Map = deckRatings => deckRatings.Select(deckRating => new 
                             { 
                                 deckRating.DeckId,
                                 TotalRating = deckRating.Rating,
                                 CountRating = 1,
                                 AverageRating = 0
                             });
        Reduce = reduceResults => reduceResults
                                      .GroupBy(reduceResult => reduceResult.DeckId)
                                      .Select(grouping => new 
                                              {
                                                  DeckId = grouping.Key, 
                                                  TotalRating = grouping.Sum(reduceResult => reduceResult.TotalRating)
                                                  CountRating = grouping.Sum(reduceResult => reduceResult.CountRating)
                                               })
                                      .Select(x => new
                                               {
                                                  x.DeckId,
                                                  x.TotalRating,
                                                  x.CountRating,
                                                  AverageRating = x.TotalRating / x.CountRating
                                               });
    }
}

关于c# - Reduce 不能在分组中包含 Average() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14233875/

相关文章:

c# - 我如何在 C# 中遍历内部属性

c# - IdentityServer 4 Https 通过自签名证书

c# - Html.EnumDropdownListFor : Showing a default text

c# - 如何在 C# 中同时运行服务的多个实例?

c# - 如何访问 ActionExecutingContext 中 ActionDescriptor 的 MethodInfo.ReturnType?

RavenDB 不会设置存储上的所有属性

c# - float 的 FlowLayout

c# - 如何避免 Entity Framework 中硬编码字段名称?

asp.net - RavenDB ASP.NET session 提供程序?

ravendb - 如何创建 RavenDB 资源管理器?