【问题标题】:Dynamic Linq Group By UnixTimeUnixTime 的动态 Linq 组
【发布时间】:2015-02-21 09:30:26
【问题描述】:

我正在使用动态 Linq。 Group By 可以这样工作:

var groupedData = resultSet.AsQueryable().GroupBy("Username", "it").Select("new (it.Key as key, it.Count() as count)");

但我想使用 unixtime 列作为分组的关键。示例表:

创建日期(整数)

1419258192 (22/12/2014 14:23:12)  
1419292800 (23/12/2014 00:00:00)  
1419349440 (23/12/2014 15:44:00)  
1419379200 (24/12/2014 00:00:00)  

我想要的结果:

22/12/2014: 1  
23/12/2014: 2  
24/12/2014: 1  

【问题讨论】:

  • 嗯,听起来您想要日期,而不仅仅是日期/时间。你真的需要在这里使用任何动态的东西吗?在我看来,一切都是静止的……
  • 什么类型的CreateDate?字符串?
  • @JonSkeet 我写了“CreatedDate”,但这只是举例。它是动态的,可以是任何列。
  • @Tim.Tang 它的整数。
  • 好的,您希望它使用哪个时区来将日期/时间值分解为日期?

标签: c# linq dynamic group-by unix-timestamp


【解决方案1】:

我会尽可能快地摆脱动态部分。然后您可以转换为DateTime 并使用Date 部分进行分组。如果您需要在字段名称中保持动态,您可以这样做,但最终会得到 IEnumerable<long> 以供进一步工作:

var groupedData = resultSet.AsQueryable()
                           .Select("CreatedDate")
                           .AsEnumerable<long>()
                           .GroupBy(UnixTimestampToDate)
                           .Select(g => new { g.Key, Count = g.Count() });

...
private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

private static DateTime UnixTimestampToDate(long timestamp)
{
    return UnixEpoch.AddSeconds(timestamp)
                    .Date;
}

如果您需要转换到不同的时区,您可以在 UnixTimestampToDate... 中执行此操作,或者只需将 unix 时间戳转换为 UTC DateTime 即可将其作为查询本身的一部分 DateTime 调用Date,然后转换到不同的时区,然后取日期。

【讨论】:

  • 完美运行!谢谢。
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多