Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-按多个属性对列表进行分组,并返回具有数组成员的对象_C#_Arrays_Linq_Group By_Google Visualization - Fatal编程技术网

C# LINQ-按多个属性对列表进行分组,并返回具有数组成员的对象

C# LINQ-按多个属性对列表进行分组,并返回具有数组成员的对象,c#,arrays,linq,group-by,google-visualization,C#,Arrays,Linq,Group By,Google Visualization,这将是一个由两部分组成的问题 我正在尝试构建一个用于GoogleCharts API的数据结构(特别是它们的数据表) 以下是我目前的代码: return Json.Encode( RMAs .Where(r => r.CreatedDate.Year > DateTime.Now.Year - 4) //Only grab the last 4 years worth of RMAs .GroupBy(r => new { Problem = r.Pro

这将是一个由两部分组成的问题

我正在尝试构建一个用于GoogleCharts API的数据结构(特别是它们的数据表)

以下是我目前的代码:

return Json.Encode(
    RMAs
    .Where(r => r.CreatedDate.Year > DateTime.Now.Year - 4) //Only grab the last 4 years worth of RMAs
    .GroupBy(r => new { Problem = r.Problem, Year = r.CreatedDate.Year, Quarter = ((r.CreatedDate.Month) / 3) })
    .Select(r => new { Problem = r.Key.Problem, Year = r.Key.Year, Quarter = r.Key.Quarter, Count = r.Count() })
);
这让我非常接近。这将得到一个类似于以下内容的数组:

{"Problem":"It broke!","Year":2012,"Quarter":2,"Count":3},
{"Problem":"It broke!","Year":2012,"Quarter":1,"Count":1}
但是,我想要的是通过“Problem”属性对数据进行进一步分组,以便每个问题的季度都是一个数组(这使得数据结构更容易迭代)。所需结构的示例:

{"Problem":"It broke!",
    {"Year":2012,"Quarter":2,"Count":3},
    {"Year":2012,"Quarter":1,"Count":1}
},
{"Problem":"Some other problem",
    {"Year":2012,"Quarter":1,"Count":31}
}
问题的第二部分:如何确保每个季度都有数据(同样,这使使用API构建数据表的迭代更加容易),即使在该季度没有出现“问题”?使用与上次相同的示例:

{"Problem":"It broke!",
    {"Year":2012,"Quarter":2,"Count":3},
    {"Year":2012,"Quarter":1,"Count":1}
},
{"Problem":"Some other problem",
    {"Year":2012,"Quarter":2,"Count":0}
    {"Year":2012,"Quarter":1,"Count":31}
}
  • 将以下内容添加到查询中:

    .GroupBy(x => x.Problem)
    .ToDictionary(g => g.Key, g => g.Select(x=>new { Year=x.Year, Quarter=x.Quarter, Count = x.Count }));
    
  • 必须在上面的.ToDictionary()之前插入以下内容:

  • 我想。。。试试看:)

    但是,我建议不要采用这种方法,在客户端上创建“空”记录,以避免过度使用带宽。

    感谢您的启发,并向我展示了您可以对分组使用LINQ

    我已经在本地环境中对此进行了测试,LINQ确实返回了一个问题列表,该列表与一系列年/季度分组(总计数)相关。我不知道Json.Encode是否以正确的格式编码

    以下LINQ应返回符合所需格式的匿名类型:

    编辑:查询现在返回至少发生一个问题但未发生指定问题的季度的计数=0

    var quarters = RMAs
        .Where(rma => rma.CreatedDate.Year > DateTime.Now.Year - 4)
        .GroupBy(rma => new { 
            Year = rma.CreatedDate.Year, 
            Quarter = ((rma.CreatedDate.Month) / 3) 
        });
    
    return Json.Encode(
        RMAs
            //Only grab the last 4 years worth of RMAs
            .Where(r => r.CreatedDate.Year > DateTime.Now.Year - 4)
            // Group all records by problem     
            .GroupBy(r => new { Problem = r.Problem })
            .Select(grouping => new
                {
                    Problem = grouping.Key.Problem,
                    Occurrences = quarters.Select(quarter => new
                        {
                            Year = quarter.Key.Year,
                            Quarter = quarter.Key.Quarter,
                            Count = grouping
                                    .GroupBy(record => new
                                    {
                                        Year = record.CreatedDate.Year,
                                        Quarter = ((record.CreatedDate.Month) / 3)
                                    })
                                    .Where(record => 
                                        record.Key.Year == quarter.Key.Year 
                                        && record.Key.Quarter == quarter.Key.Quarter
                                    ).Count()
                        }).ToArray()
                }));
    
    更新:感谢您使用示例JSON输出进行更新:

    [{"Problem":"P","Occurrences":[{"Year":2012,"Quarter":4,"Count":2},{"Year":2012,"Quarter":2,"Count":1},{"Year":2012,"Quarter":1,"Count":1}]},{"Problem":"Q","Occurrences":[{"Year":2012,"Quarter":3,"Count":1},{"Year":2012,"Quarter":2,"Count":1},{"Year":2012,"Quarter":1,"Count":1}]}]
    
    这是JSON输出的一个示例:

    [{"Problem":"P","Occurrences":[{"Year":2012,"Quarter":4,"Count":2},{"Year":2012,"Quarter":2,"Count":1},{"Year":2012,"Quarter":1,"Count":1}]},{"Problem":"Q","Occurrences":[{"Year":2012,"Quarter":3,"Count":1},{"Year":2012,"Quarter":2,"Count":1},{"Year":2012,"Quarter":1,"Count":1}]}]
    

    以下是满足您所有标准的完整重述:

    public static IEnumerable<DateTime> GetQuarterDates()
    {
        for (DateTime quarterDate = DateTime.Now.AddYears(-4); quarterDate <= DateTime.Now; quarterDate = quarterDate.AddMonths(3))
        {
            yield return quarterDate; 
        }
    }
    
    public static void RunSnippet()
    {
        var RMAs = new[] {
            new { Problem = "P", CreatedDate = new DateTime(2012, 6, 2) },
            new { Problem = "P", CreatedDate = new DateTime(2011, 12, 7) },
            new { Problem = "P", CreatedDate = new DateTime(2011, 12, 8) },
            new { Problem = "P", CreatedDate = new DateTime(2011, 8, 1) },
            new { Problem = "P", CreatedDate = new DateTime(2011, 4, 1) },
            new { Problem = "Q", CreatedDate = new DateTime(2011, 11, 11) },
            new { Problem = "Q", CreatedDate = new DateTime(2011, 6, 6) },
            new { Problem = "Q", CreatedDate = new DateTime(2011, 3, 3) }
        };
    
        var quarters = GetQuarterDates().Select(quarterDate => new { Year = quarterDate.Year, Quarter = Math.Ceiling(quarterDate.Month / 3.0) });
    
        var rmaProblemQuarters = from rma in RMAs
                where rma.CreatedDate > DateTime.Now.AddYears(-4)
                group rma by rma.Problem into rmaProblems
                select new {
                                Problem = rmaProblems.Key,
                                Quarters = (from quarter in quarters
                                            join rmaProblem in rmaProblems on quarter equals new { Year = rmaProblem.CreatedDate.Year, Quarter = Math.Ceiling(rmaProblem.CreatedDate.Month / 3.0) } into joinedQuarters
                                            from joinedQuarter in joinedQuarters.DefaultIfEmpty()
                                            select new {
                                                            Year = quarter.Year,
                                                            Quarter = quarter.Quarter,
                                                            Count = joinedQuarters.Count()
                                                       })
                           };
    
        string json = System.Web.Helpers.Json.Encode(rmaProblemQuarters);
        Console.WriteLine(json);
    }
    

    嗨,Jon,我添加了一个由代码生成的实际JSON示例。看来你和我的想法差不多。@JamieSee-谢谢!我从未使用过JSON,因此我修改了代码,将结果存储在变量中,并将其打印到控制台,以查看其结构是否正确。我没有机会看到实际的Json.Encode调用是否有效。您的答案没有完全回答这个问题?第二部分询问如何在没有任何问题的情况下返回季度信息,而您的解决方案不会这样做。更新的解决方案现在应该包括第二部分。根据示例,它不包括完全没有问题的年度/季度组合。与JonSenchyna类似,您的答案无法解决问题的第二部分。更新答案以满足空季度标准。另外,我用Linq语法而不是Linq方法调用重申了它,因为它越来越难阅读。在问题的第二部分中,您是否筛选出没有问题的年/季度组合(即年=2012,季度=3)?
    [{"Problem":"P","Quarters":[{"Year":2008,"Quarter":2,"Count":0},{"Year":2008,"Quarter":3,"Count":0},{"Year":2008,"Quarter":4,"Count":0},{"Year":2009,"Quarter":1,"Count":0},{"Year":2009,"Quarter":2,"Count":0},{"Year":2009,"Quarter":3,"Count":0},{"Year":2009,"Quarter":4,"Count":0},{"Year":2010,"Quarter":1,"Count":0},{"Year":2010,"Quarter":2,"Count":0},{"Year":2010,"Quarter":3,"Count":0},{"Year":2010,"Quarter":4,"Count":0},{"Year":2011,"Quarter":1,"Count":0},{"Year":2011,"Quarter":2,"Count":1},{"Year":2011,"Quarter":3,"Count":1},{"Year":2011,"Quarter":4,"Count":2},{"Year":2011,"Quarter":4,"Count":2},{"Year":2012,"Quarter":1,"Count":0},{"Year":2012,"Quarter":2,"Count":1}]},{"Problem":"Q","Quarters":[{"Year":2008,"Quarter":2,"Count":0},{"Year":2008,"Quarter":3,"Count":0},{"Year":2008,"Quarter":4,"Count":0},{"Year":2009,"Quarter":1,"Count":0},{"Year":2009,"Quarter":2,"Count":0},{"Year":2009,"Quarter":3,"Count":0},{"Year":2009,"Quarter":4,"Count":0},{"Year":2010,"Quarter":1,"Count":0},{"Year":2010,"Quarter":2,"Count":0},{"Year":2010,"Quarter":3,"Count":0},{"Year":2010,"Quarter":4,"Count":0},{"Year":2011,"Quarter":1,"Count":1},{"Year":2011,"Quarter":2,"Count":1},{"Year":2011,"Quarter":3,"Count":0},{"Year":2011,"Quarter":4,"Count":1},{"Year":2012,"Quarter":1,"Count":0},{"Year":2012,"Quarter":2,"Count":0}]}]