C# Linq查询:不同年份+;动态名称

C# Linq查询:不同年份+;动态名称,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我试图获取一个DateTime字段并创建一个DateObject列表,其中DateObject有两个属性(Year和Range)。我想确定DateTime字段的年份,然后。。。如果是偶数,我想把那一年保留一年。如果是奇怪的,我想把年的改为-1年 然后,基于此,我想为范围标识一个字符串,看起来像“[EvenYear]到[EvenYear+1]” 我的数据如下所示: 表格数据 ID(即1) 日期(即2017年7月12日) 如果记录如下所示: ID:1,日期:2017年12月7日(2017年应改

我试图获取一个DateTime字段并创建一个DateObject列表,其中DateObject有两个属性(Year和Range)。我想确定DateTime字段的年份,然后。。。如果是偶数,我想把那一年保留一年。如果是奇怪的,我想把年的改为-1年

然后,基于此,我想为范围标识一个字符串,看起来像“[EvenYear]到[EvenYear+1]”

我的数据如下所示:

表格数据

  • ID(即1)
  • 日期(即2017年7月12日)
如果记录如下所示:

  • ID:1,日期:2017年12月7日(2017年应改为2016年)
  • ID:2,日期:2016年1月1日(2016年)
  • ID:3,日期:2016年1月2日(2016年)
  • ID:4,日期:2015年5月10日(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))
}
var sessionYears=db.tblDates.GroupBy(x=>(x.Date.Year%2==0?x.Date.Year:x.Date.Year-1)).ToList();
返回sessionYears.Select(x=>newlist{
StartYear=x.键,
范围=x。选择(y=>y.Date.Year+”到“+(y.Date.Year+1))
}

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

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

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

为什么你要在两个选择之后使用它们?为什么不在第一个选择中创建一个
DateRangeObject
?@Jerodev我更新了我最后更改的内容。我想我只是在尝试多个东西,并将它们堆叠起来并注释其他东西,哈哈。感谢您的回复!如果不清楚,很抱歉,但年终应该是一个st基本上写着“从1年到2年”的戒指。不过我会试试你的方法。:)把
EndYear
变成一个字符串并没有太大的变化,我更新了我的答案。:)dbContext.tblDates是IQueryable,而不是IEnumerable。我本以为IQueryable不知道如何创建EndYear。嗯,好吧,所以我得到了EndYear=$“{…”部分,但这只是失败了。我以前从未在linq中见过这种代码。这是一个拼写错误吗?我将它改为…EndYear=startYear+“-”+(startYear+1)…但现在我得到一个错误:在x=>(在第一次选择之后)。它声明:具有语句体的lambda无法转换为表达式树。我已更新答案,使其不使用语句体