2015-11-20 3 views
3

В базе данных SQL Server у меня есть таблица с записями журнала - timestamp и description.LINQ2SQL и NHibernate, группировка по вычисленным столбцам

Мне нужно получить появление журналов через определенные промежутки времени (30 минут).

Например:

01.01.2015 00:00 - 100 
01.01.2015 00:30 - 200 
01.01.2015 01:00 - 2 

и так далее ...

Что у меня есть:

var logs = session.Query<Log>; 

//... other operations on logs queryable 

var intervalInMinutes = 30; 
var logsFrequency = logs 
    .GroupBy(l => new 
    { 
     Year = l.LogTimestamp.Year, 
     Month = l.LogTimestamp.Month, 
     Day = l.LogTimestamp.Day, 
     Hour = l.LogTimestamp.Hour, 
     Minute = (l.LogTimestamp.Minute/intervalInMinutes) * intervalInMinutes, 
    }) 
    .Select(g => new LogsOccurence() 
    { 
     StartingDatetime = new DateTime(g.Key.Year, g.Key.Month, g.Key.Day, g.Key.Hour, g.Key.Minute, 0), 
     Frequency = g.Count() 
    }) 
    .ToList(); 

После запроса не удается:

исключение типа «NHibernate .Exceptions.GenericADOException 'произошел в NHibernate .dll, но не был обработан в пользовательском коде

Дополнительная информация: не удалось выполнить запрос

Внутреннее исключение: Колонка «dbo.Log.LogTimestamp» недопустим в списке выбора, поскольку он не содержится ни в совокупности или предложение GROUP BY.

Сформирован выберите утверждение:

select 
    datepart(year, Log0_.LogTimestamp) as col_0_0_ 
    , datepart(month, Log0_.LogTimestamp) as col_1_0_ 
    , datepart(day, Log0_.LogTimestamp) as col_2_0_ 
    , datepart(hour, Log0_.LogTimestamp) as col_3_0_ 
    , datepart(minute, Log0_.LogTimestamp) as col_4_0_ 
    , cast(count(*) as INT) as col_5_0_ 
from 
    dbo.[Log] Log0_ 
group by 
    datepart(year, Log0_.LogTimestamp) 
    , datepart(month, Log0_.LogTimestamp) 
    , datepart(day, Log0_.LogTimestamp) 
    , datepart(hour, Log0_.LogTimestamp) 
    , datepart(minute, Log0_.LogTimestamp)/@p0*@p1 
Name:p1 - Value:30 Name:p2 - Value:30 
  1. Приоритет операторов/заказ является неправильным в groupby п

    datepart(minute, Log0_.LogTimestamp)/@p0 * @p1 
    
  2. Выберите часть за несколько минут отличается от групповой части для минут - выберите сбой

Что не так с моим Linq и как правильно писать?

Я использую NHibernate build 4.0.4.GA.

+0

Это похоже на ошибку. Я протестировал ваш Linq-запрос с использованием LinqToSql (Entity Framework), и он работал нормально. Я также посмотрел на отслеживание проблем NHibernate JIRA (https://nhibernate.jira.com) на открытые ошибки, но, похоже, никто не соответствует этому. Итак, я думаю, что это неподтвержденная ошибка. – Ismael

ответ

0

Приоритет операторов/заказ является неправильным в пункте GroupBy

Оператор предшествования выглядит правильно для меня. Умножение и деление имеют одинаковый уровень приоритета как в C#, так и в T-SQL. Таким образом, ...

datepart(minute, Log0_.LogTimestamp)/@p0 * @p1 

... эквивалентно ...

(datepart(minute, Log0_.LogTimestamp)/@p0) * @p1 

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

Он также отличается в запросе LINQ. Поскольку у GroupBy есть ...

Minute = (l.LogTimestamp.Minute/intervalInMinutes) * intervalInMinutes, 

..., то Select должен также иметь ...

g.Key.Minute/intervalInMinutes * intervalInMinutes 

Это может возможно исправить.

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