.net – LINQ to SQL – 按小时分组

考虑到列类型是DateTime,如何将LINQ到SQL查询的结果分组?

解决方法

这是解决技术小时(上下文)的一个解决方案.
var query = myDC.Orders
    .GroupBy(x => x.OrderDate.Hour)
    .Select(g => new {
        Hour = g.Key,Amount = g.Sum(x => x.OrderAmount)
    });

哪个产生这个:

SELECT SUM([t1].[OrderAmount]) AS [Amount],[t1].[value] AS [Hour]
FROM (
    SELECT DATEPART(Hour,[t0].[OrderDate]) AS [value],[t0].[OrderAmount]
    FROM [dbo].[Orders] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

这是一个营业时间的解决方案(上下文).

DateTime zeroDate = new DateTime(2008,1,1);

var query = myDC.Orders
    .GroupBy(x => System.Data.Linq.sqlClient.sqlMethods.DateDiffHour(zeroDate,x.OrderDate)
    )
    .Select(g => new { Hours = g.Key,Amount = g.Sum(x => x.OrderAmount) })
    .Select(x => new { Hour = zeroDate.AddHours(x.Hours),Amount = x.Amount});

哪个产生这个:

SELECT DATEADD(ms,(CONVERT(BigInt,(CONVERT(Float,[t2].[value2])) * 3600000)) % 86400000,DATEADD(day,[t2].[value2])) * 3600000)) / 86400000,@p1)) AS [Hour],[t2].[value] AS [Amount]
FROM (
    SELECT SUM([t1].[OrderAmount]) AS [value],[t1].[value] AS [value2]
    FROM (
        SELECT DATEDIFF(Hour,@p0,[t0].[OrderAmount]
        FROM [dbo].[Orders] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    ) AS [t2]

嗯 – 那个bigint / float /毫秒的东西是丑陋和难以验证.我更喜欢在客户端添加

var results = myDC.Orders
    .GroupBy(x => System.Data.Linq.sqlClient.sqlMethods.DateDiffHour(zeroDate,Amount = g.Sum(x => x.OrderAmount) })
    .ToList()
    .Select(x => new { Hour = zeroDate.AddHours(x.Hours),Amount = x.Amount});

哪个产生这个:

SELECT SUM([t1].[OrderAmount]) AS [Amount],[t1].[value] AS [Hours]
FROM (
    SELECT DATEDIFF(Hour,[t0].[OrderAmount]
    FROM [dbo].[Orders] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

这是做上下文时间的第三种方式.这个非常c#友好,但数据库中有字符串逻辑(yuck).

var query = myDC.Orders
    .GroupBy(x => new DateTime(x.OrderDate.Year,x.OrderDate.Month,x.OrderDate.Day,x.OrderDate.Hour,0))
    .Select(g => new { Hour = g.Key,Amount = g.Sum(x => x.OrderAmount) });

哪个生成

SELECT SUM([t1].[OrderAmount]) AS [Amount],[t1].[value] AS [Hour]
FROM (
    SELECT CONVERT(DATETIME,(CONVERT(NCHAR(4),DATEPART(Year,[t0].[OrderDate])) + ('-' + (CONVERT(NCHAR(2),DATEPART(Month,[t0].[OrderDate])) + ('-' + CONVERT(NCHAR(2),DATEPART(Day,[t0].[OrderDate])))))) + (' ' + (CONVERT(NCHAR(2),DATEPART(Hour,[t0].[OrderDate])) + (':' + (CONVERT(NCHAR(2),@p0) + (':' + CONVERT(NCHAR(2),@p1)))))),120) AS [value],[t0].[OrderAmount]
    FROM [dbo].[Orders] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...