Группировать с помощью 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();
Другие вопросы по тегам