2

これは 2 つの部分からなる質問になります。

Google Charts 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":"It broke!",
    {"Year":2012,"Quarter":2,"Count":3},
    {"Year":2012,"Quarter":1,"Count":1}
},
{"Problem":"Some other problem",
    {"Year":2012,"Quarter":1,"Count":31}
}

質問の 2 番目の部分: 「問題」が発生しなかったとしても、各四半期のデータを確保するにはどうすればよいですか (これにより、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}
}
4

3 に答える 3

2

インスピレーションを与えてくれたTA 氏と、グループに対して LINQ を使用できることを示してくれたことに感謝します。

これをローカル環境でテストしたところ、LINQ は実際に、年/四半期のグループ化の配列に関連付けられた問題のリストと合計カウントを返します。ただし、 Json.Encode が正しい形式でエンコードするかどうかはわかりません。

次の LINQ は、必要な形式に適合する匿名型を返す必要があります。

編集:クエリは、少なくとも 1 つの問題が発生したが、指定された問題が発生しなかった四半期に対して count=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 出力の例を更新してくれたJamieSeeに感謝します。

これは 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}]}]
于 2012-06-08T17:02:36.507 に答える
1
  1. クエリに以下を追加します。

    .GroupBy(x => x.Problem)
    .ToDictionary(g => g.Key, g => g.Select(x=>new { Year=x.Year, Quarter=x.Quarter, Count = x.Count }));
    
  2. 上記の.ToDictionary()の前に以下を挿入する必要があります。

    .Select(g =>
      new { 
        Key = g.Key, 
        Items = 
          g
            .GroupBy(r => r.Year)
            .SelectMany(gy =>
              gy.Concat(
                Enumerable.Range(1,5)
                  .Where(q => !gy.Any(r=>r.Quarter == q))
                  .Select(q => new { Problem = g.Key, Year = gy.Key, Quarter = q, Count = 0 })
              )
            )
      }
    )
    

私は思う...それを試してみてください:)

ただし、このアプローチに従うことはお勧めしません。帯域幅の過度の使用を避けるために、クライアントに「空の」レコードを作成してください。

于 2012-06-08T16:59:31.790 に答える
0

Here's the full restatement to meet all your criteria:

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);
}

Which yields:

[{"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}]}]
于 2012-06-08T17:57:58.217 に答える