在 SQL Server 数据库中,我有一个包含日志条目的表 - timestamp
和 description
。
我需要获取指定时间间隔(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();
以下查询失败:
An exception of type 'NHibernate.Exceptions.GenericADOException' occurred in NHibernate.dll but was not handled in user code
Additional information: could not execute query
Inner exception: Column 'dbo.Log.LogTimestamp' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
生成的选择语句是:
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
groupby
子句中的运算符优先级/顺序错误datepart(minute, Log0_.LogTimestamp) / @p0 * @p1
分钟的选择部分与分钟的组部分不同 - 选择失败
我的 Linq 有什么问题,如何编写正确的?
我正在使用 NHibernate build 4.0.4.GA。
最佳答案
Operator precedence / order is wrong in groupby clause
运算符优先级在我看来是正确的。乘法和除法在 C# 中具有相同的优先级和 T-SQL .于是……
datepart(minute, Log0_.LogTimestamp) / @p0 * @p1
...等同于...
(datepart(minute, Log0_.LogTimestamp) / @p0) * @p1
Select part for minutes is different than group part for minutes - select fails.
在LINQ查询中也是不同的。因为 GroupBy
有...
Minute = (l.LogTimestamp.Minute / intervalInMinutes) * intervalInMinutes,
...,Select
也应该有...
g.Key.Minute / intervalInMinutes * intervalInMinutes
这可能会解决问题。
关于c# - LINQ2SQL 和 NHibernate,按计算列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835237/