これを重複として閉じる前に、「 [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
が間違っているだけですか?