c# - LINQ2SQL 和 NHibernate,按计算列分组

标签 c# sql-server nhibernate linq-to-sql

在 SQL Server 数据库中,我有一个包含日志条目的表 - timestampdescription

我需要获取指定时间间隔(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
  1. groupby 子句中的运算符优先级/顺序错误

    datepart(minute, Log0_.LogTimestamp) / @p0 * @p1
    
  2. 分钟的选择部分与分钟的组部分不同 - 选择失败

我的 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/

相关文章:

c# - Realm .NET 其中 Contains() 查询抛出 System.NotSupportedException

c# - "Two-dimensional"用户控件

sql - 如何在 SQL 中以 0.25 增量执行自定义回合?

nhibernate - 通用 ADOException : could not insert

Mysql + Nhibernate + MVC

c# - 如何从多个流畅的 NHibernate session 工厂获取结果?

c# - 当 MainWindow 完全用 C# 构建时,我在哪里可以添加方法调用

c# - 此 C# 语句的 VB.NET 版本是否需要 unchecked 关键字?

sql-server - 无法连接到 Azure 虚拟机中托管的 SQL Server 2008 命名实例

sql-server - 使用SQL Server报表生成器执行类似SUMIF的操作