Linq查询:不同的年份+动态名称

时间:2017-12-07 14:56:25

标签: c# entity-framework linq linq-to-entities

我正在尝试使用DateTime字段并创建DateObject列表,其中DateObject有2个属性(范围)。我想确定DateTime字段的年份然后......如果它是偶数,我想保留那一年。如果它很奇怪,我想将它改为年份 - 年份

然后,基于此,我想识别 Range 的字符串,它看起来像“[EvenYear] to [EvenYear + 1]”。

我的数据如下:

资料表

  • ID(即1)
  • 日期(即12/7/2017)

如果记录如下:

  • ID:1,日期:12/7/2017(2017年应更改为2016年)
  • ID:2,日期:2016年1月1日(保持2016年)
  • ID:3,日期:1/2/2016(保持2016年)
  • ID:4,日期:2015年10月5日(2015年为2014年)

我希望DateObjects的输出列表看起来像这样(基于年份分开):

  • 年度:2014年,范围:2014年至2015年
  • 年度:2016年,范围:2016年至2017年

我很沮丧地搞清楚这一点。我尝试了很多代码。

这是我遗留下来的代码,但仍然失败了:

var sessionYears = db.tblDates.GroupBy(x => (x.Date.Year % 2 == 0 ? x.Date.Year : x.Date.Year - 1)).ToList();

return sessionYears.Select(x => new List<DateObject>                {
StartYear= x.Key,
Range = x.Select(y => y.Date.Year + " to " + (y.Date.Year + 1))
}

我已经尝试过使用distinct和groupby,但我显然缺少一些步骤等等。我在网上找不到任何东西。任何帮助将不胜感激!!!提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以先创建DateRangeObject列表,然后再获取不同的值。这将使您的查询更加简单。

return db.tblDates
    .Select(x => new DateRangeObject {
        StartYear = x.Date.Year % 2 == 0 ? x.Date.Year : x.Date.Year - 1,
        EndYear = (x.Date.Year % 2 == 0 ? x.Date.Year : x.Date.Year - 1) + " - " + ((x.Date.Year % 2 == 0 ? x.Date.Year : x.Date.Year - 1) + 1);
    })
    .GroupBy(x => x.StartYear)
    .Select(x => x.First())
    .ToList();