2015-03-27 2 views
1

У меня есть таблица под названием «Образцы» со следующими столбцами: Id, Type, Quantity, Unit, SampleTime.Как получить среднестатистические данные за месяц

У меня есть следующее заявление, которое вычисляет ежедневный средний вес:

weightchart.data = db.Samples 
    .Where(n => n.Type == "weight") 
    .GroupBy(n => DbFunctions.TruncateTime(n.SampleTime)) 
    .Select(item => new ChartData() 
{ 
    timestamp = item.Key, 
    average = item.Average(a => a.Quantity), 
    max = item.Max(a => a.Quantity), 
    min = item.Min(a => a.Quantity), 
    count = item.Count() 
}).OrderBy(n => n.timestamp).ToList(); 
charts.Add(weightchart); 

Теперь я хотел бы получить в среднем ежечасно. Я не могу понять, как это сделать. Я новичок в C#, linq и сущности.

Обновление: Я обновил свое заявление к этому:

weightchart.data = db.Samples.Where(n => n.Type == "weight").GroupBy(n => new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour }).Select(item => new ChartData() 
{ 
    timestamp = new DateTime(item.Key.Date.Year, item.Key.Date.Month, item.Key.Date.Day, item.Key.Date.Hour, 0, 0), 
    average = item.Average(a => a.Quantity), 
    max = item.Max(a => a.Quantity), 
    min = item.Min(a => a.Quantity), 
    count = item.Count() 
}).OrderBy(n => n.timestamp).ToList(); 
charts.Add(weightchart); 

Однако я получаю это исключение:

исключения типа 'System.NotSupportedException' произошел в EntityFramework.SqlServer .dll, но не обрабатывается в коде пользователя Дополнительная информация: Указанный член типа 'Дата' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности. обновление

+0

Вы можете попробовать использовать 'SqlFunctions.DatePart', но я не уверен, что его поддерживают версии EF. – MarcinJuraszek

+0

Можете ли вы дать мне пример кода? У меня есть Google для этого, и многие примеры, которые я не могу использовать, поскольку большинство людей не используют сущности, но Linq to Sql, я считаю. – rukiman

+0

Пожалуйста, разместите свой ответ в качестве ответа, а не редактируйте его. – abatishchev

ответ

0

см ниже

Предполагая, что тип SampleTime является System.DateTime, вы можете изменить GroupBy к .GroupBy(n => n.SampleTime.Hour), и что позволит вам вычислить среднее за час. Имейте в виду, что DateTime.Hour возвращает часы от 0 до 23.


Попробуйте что-то вроде следующего. Я немного упрощен, но если вы можете проверить, что он работает, вы можете изменить его на все, что вы пытаетесь. Кроме того, мне сложно проверить его, потому что сначала я бы построил образцы данных). Объяснение того, что происходит (ограничение LINQ to SQL) - here, и полезный намек на то, как более легко обойти ограничение через AsEnumerable() - here.

var dataAsList = (from n in db.Samples.Where(n => n.Type == "weight").AsEnumerable() 
group n by new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour } into g 
select new 
{ 
    dategrouping = g.Date, 
    hourgrouping = g.Hour, 
    average = g.Average(a => a.Quantity), 
    max = g.Max(a => a.Quantity), 
    min = g.Min(a => a.Quantity), 
    count = g.Count() 
}).ToList(); 
+0

SampleTime имеет DateTime. Я думаю, вы имели в виду n.SampleTime.Hour? Поскольку код, который вы представили, не компилируется. – rukiman

+0

Вы правы. Спасибо! Я починил это. – DWright

+0

Похоже, вы используете имена типов как имена членов в анонимном объекте: 'new {Date = n.SampleTime.Date, Hour = n.SampleTime.Hour}'. Попробуйте что-то вроде 'new {theDate = n.SampleTime.Date, theHour = n.SampleTime.Hour}' и посмотрите, поможет ли это. Конечно, вам, возможно, придется изменить имена в другом месте запроса. – DWright

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