如何使用 LINQ 生成透视数据

本文关键字:透视 数据 何使用 LINQ | 更新日期: 2023-09-27 18:35:52

在将其关闭为重复项之前,请注意,我知道有很多关于"[c#] [linq] pivot"的问题,我花了一整天的时间试图解决这个问题,直到现在才转向 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

(只需要显示最近三个月的数据)。我正在尝试这个:

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

搜索了很多,发现这个问题与我的挑战完全匹配。但是,如果我在 Where 谓词的末尾添加 .Select(c => c.Value)(因为我只需要该时间段的值),则代码不会编译。

"

char"不包含"值"的定义

提到的问题显示了完全相同的事情(他们只是使用总和而不是选择)

我在这里做错了什么?我的尝试是完全错误的还是只是得到Value是错误的?

如何使用 LINQ 生成透视数据

因为您正在枚举该字符串中的字符的字符串上调用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)  

你有没有尝试过做这样的事情?

g.Where(c => DateTime.ParseExact(c.CollectionPeriod, "yyyyMM", CultureInfo.InvariantCulture).Month == thisMonth - 3).Select(c => c.Value).FirstOrDefault();