2

これを重複として閉じる前に、「 [c#] [linq] ピボット」について多くの質問があることを認識しており、これを修正するために丸一日を費やし、SO に変わったのは今だけであることに注意してください。

データベースから次の形式でデータを取得します。

Item    Collection_Period   Value
====    =================   =====
Item3       201307          27.2
Item4       201308          19
Item3       201209          2.1
Item2       201307          345
Item1       201309          13.11
Item2       201308          34
Item3       200609          85
Item4       201308          58.2
Item3       201209          2.4
Item2       201309          12.1
Item1       201209          12.3

データを次の形式に操作する必要があります。

Item    CurrMon-3   CurrMon-2   CurrMon-1
=====   =========   =========   =========
Item1                           13.11
Item2   345         34          12.1
Item3   27.2
Item4   19          58.2

(過去 3 か月のデータのみを表示する必要があります)。私はこれを試しています:

var pivoted = new List<PivotedMeanData>();
var thisMonth = DateTime.Now.Month;
var p = meanData
    .GroupBy(i => i.Description)
    .Select(g => new PivotedMeanData
    {
        Description = g.Key,
        M3 = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, "yyyyMM", CultureInfo.InvariantCulture).Month == thisMonth - 3).ToString().Select(c => c.Value),
        M2 = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, "yyyyMM", CultureInfo.InvariantCulture).Month == thisMonth - 2).ToString().Select(c => c.Value),
        M1 = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, "yyyyMM", CultureInfo.InvariantCulture).Month == thisMonth - 1).ToString().Select(c => c.Value)
    });
return pivoted;

このデータを保持するクラスがあります。

public class PivotedMeanData
{
    public string Description { get; set; }
    public string M3 { get; set; }
    public string M2 { get; set; }
    public string M1 { get; set; }
}

MeanData クラスの定義:

public class MeanData
{
    public string Description { get; set; }
    public long SeqNo { get; set; }
    public string CollectionPeriod { get; set; }
    public long Value { get; set; }
}

私はよく検索し、この質問が私の課題に完全に一致することを発見しました. .Select(c => c.Value)ただし、 Where述語の最後に(その期間の値が必要なため)を追加すると、コードはコンパイルされません。

'char' には 'Value' の定義が含まれていません

参照された質問はまったく同じことを示しています(選択の代わりに合計を使用しただけです)

ここで何が間違っていますか?私の試みは完全に間違っていますか、それとも取得Valueが間違っているだけですか?

4

2 に答える 2

4

Select()その文字列内の文字を列挙している文字列を呼び出しているため:

M3 = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, 
                                      "yyyyMM", 
                                      CultureInfo.InvariantCulture)
                          .Month == thisMonth - 3)
      .ToString()      // string
      .Select(c => c.Value)  //c = char

私はあなたがしたいと思う

M3 = g.Where(c => DateTime.ParseExact(c.CollectionPeriod, 
                                      "yyyyMM", 
                                      CultureInfo.InvariantCulture)
                          .Month == thisMonth - 3)
      .Sum(c => c.Value)  
于 2013-10-18T13:03:02.083 に答える