Группировать с помощью Entity Framework
Я получаю 48 файлов в день на полчаса с рынка. Эти файлы имеют время начала как свойство. Я использую Entity Framework для просмотра этих файлов в веб-приложении, и поскольку файлы имеют британское время, но я работаю с европейским рынком, торговый день начинается накануне в 23:00, и поэтому я хочу сгруппировать их вместе, основываясь на торговле. день.
В 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#, используя следующую попытку:
IEnumberable<IGrouping<DateTime,ImbalanceCost> imbalanceCost = db.ImbalanceCost.GroupBy(ic => ic.START_TIME).ToArray();
Есть ли способы сначала добавить час в мою группу, а затем использовать только часть даты этого нового вычисленного значения?
2 ответа
Есть ли способы сначала добавить час в мою группу, а затем использовать только часть даты этого нового вычисленного значения?
В LINQ to Entities (EF6) речь идет об использовании соответственно канонических функций. DbFunctions.AddHours
а также DbFunctions.TruncateTime
:
db.ImbalanceCost.GroupBy(ic =>
DbFunctions.TruncateTime(DbFunctions.AddHours(ic.START_TIME, 1)).Value)
Обратите внимание, что .Value
(или приведение к DateTime
), чтобы сделать результат DateTime
скорее, чем DateTime?
возвращается каноническим методом в случае ic.START_TIME
не обнуляется, следовательно, вы знаете, что результат также не обнуляем.
Если я вас правильно понимаю, вы хотите добавить час к времени начала и сгруппировать по дате. Это можно сделать следующим образом:
var imbalanceCost = db.ImbalanceCost
.Select(x => EntityFunctions.AddHours(x.START_TIME, 1))
.GroupBy(ic => ic.Value.Date)
.ToArray();