2013-08-01 4 views
-1

У меня есть таблица sql, в которой представлены исторические значения потребления энергии. Теперь мне нужно выполнить некоторые запросы, чтобы получать статистику по часам, дням, неделям, месяцам и годам. Конечно, каждый из них разделен. Пример запроса:Сортировать по дате и группе за день

from c in context.ConsumptionSet 
join e in context.EquipmentSet on c.EquipmentID equals e.EquipmentID 
orderBy c.Date 
group new { c, e } by c.Date into grp 
select new 
{ 
    date = grp.Key.Day, 
    value = grp.GroupBy(i => i.e.EquipmentID).Sum(g => g.Max(i => i.c.Value)) 
}) 

A Вы можете видеть, я хочу, чтобы список заказываются по дате первого (который относится к типу DateTime), а затем группируются в день. Однако этот выше запрос не предоставил мне исключенный результат. Что мне там недостает?

+0

Какой результат вы получили? –

+0

Проблема может заключаться в том, что 'group' уничтожает заказ, наложенный' orderBy'. ([Ссылка] (http://stackoverflow.com/questions/204505/preserving-order-with-linq)) –

+0

точно, я не получаю ожидаемый порядок, просто случайные значения .. так что я должен в чтобы получить желаемый результат? – mahoosh

ответ

0

Предполагая, что вы храните значения с датой и временем, то группировка ими будет иметь мало или вообще не будет эффекта. Для группировки вам нужно равное значение для группировки.

Например:

Id | Date 
---+------------------------ 
1 | 2013-01-01 1:23:45.333 
2 | 2013-01-01 2:34:56.667 

Группировка по Date не поможет, потому что значения различны. Вместо этого мне нужно было бы сгруппировать чем-то более значимым, возможно, днем.

Для этого в Entity Framework используйте методы в классах EntityFunctions или SqlFunctions. Например:

from foo in context.Whatever 
group foo by EntityFunctions.TruncateTime(foo.Date) into grp 
... 

Теперь вы группируете только дату. Поскольку обе строки находятся на 2013-01-01, они будут сгруппированы вместе.

Смежные вопросы