Как получить среднечасовые значения моих данных

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);

Теперь я хотел бы получить почасовое среднее. Я не могу понять, как это сделать. Я новичок в С#, 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 его поддерживают.
  • 0
    Вы можете дать мне пример кода? Я использую Google для этого и множество примеров, которые я не могу использовать, так как, похоже, большинство людей не используют сущности, но я верю, что от Linq до Sql.
Показать ещё 1 комментарий
Теги:
sql-server
linq
entity-framework
linq-to-entities

1 ответ

0
Лучший ответ

см. обновление ниже

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


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

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? Поскольку код, который вы представили, не компилируется.
  • 0
    Похоже, вы используете имена типов в качестве имен членов в вашем анонимном объекте: new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour } . Попробуйте что-то вроде new { theDate = n.SampleTime.Date, theHour = n.SampleTime.Hour } и посмотрите, поможет ли это. Конечно, вам, возможно, придется изменить имена в другом месте запроса.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню