У меня есть таблица под названием "Образцы" со следующими столбцами: 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. Поддерживаются только инициализаторы, сущности и свойства навигации сущности.
см. обновление ниже
Предполагая, что тип 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();
new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour }
. Попробуйте что-то вроде new { theDate = n.SampleTime.Date, theHour = n.SampleTime.Hour }
и посмотрите, поможет ли это. Конечно, вам, возможно, придется изменить имена в другом месте запроса.
SqlFunctions.DatePart
, но я не уверен, какие версии EF его поддерживают.