1

我每天每半小时从市场收到 48 个文件。这些文件有一个开始时间作为一个属性。我正在使用实体框架在 Web 应用程序中查看这些文件,因为这些文件有英国时间,但我正在与欧洲市场合作,交易日从前一天晚上 11 点开始,所以我想根据交易将这些文件组合在一起天。

在 SQL 中,我可以通过以下方式完成此操作:

select cast(DATEADD(hour, 1, START_TIME) as date), count(cast(START_TIME as date)) 
from imbalancecost
group by cast(DATEADD(hour, 1, START_TIME) as date)  

我正在尝试使用以下尝试在 C# 中实现类似的结果:

IEnumerable<IGrouping<DateTime, ImbalanceCost> imbalanceCost = db.ImbalanceCost.GroupBy(ic => ic.START_TIME).ToArray();

有什么方法可以先将小时添加到我的分组中,然后仅使用这个新计算值的日期部分?

4

2 回答 2

3

有什么方法可以先将小时添加到我的分组中,然后仅使用这个新计算值的日期部分?

在 LINQ to Entities (EF6) 中,分别使用规范函数DbFunctions.AddHoursDbFunctions.TruncateTime

db.ImbalanceCost.GroupBy(ic => 
    DbFunctions.TruncateTime(DbFunctions.AddHours(ic.START_TIME, 1)).Value)

请注意,.Value(或强制转换为DateTime)是在不可为空的情况下生成结果DateTime而不是DateTime?由规范方法返回ic.START_TIME,因此您知道结果也不可为空。

于 2018-04-09T16:39:58.010 回答
1

如果我理解正确,您想在开始时间上增加一个小时并按日期部分分组。可以这样做:

var imbalanceCost = db.ImbalanceCost
    .Select(x => EntityFunctions.AddHours(x.START_TIME, 1))
    .GroupBy(ic => ic.Value.Date)
    .ToArray();
于 2018-04-09T15:23:53.477 回答