gpt4 book ai didi

c# - GroupBy 与 EF Core 6.0 和 SQL Server

转载 作者:行者123 更新时间:2023-12-04 14:46:12 24 4
gpt4 key购买 nike

我有一个 Blazor Web 应用程序,它已经在该领域工作了几个月。我想将数据库查询扩展到类似的“检测”组。
它是从 .NET 5 开始编写的,就在今天更新到 .NET 6 并尝试使其正常工作。
我想知道如何得到按TimeStamp排序的结果(DateTime 属性)。我有一个内存数据库的工作示例,但生产将在 SQL Server 中进行。我在 SQL 方面不是那么好,但我在 Management Studio 中玩了一段时间,但没有运气。
注释掉 OrderByDescending()正确地将事物分组,但结果的顺序不正确。 EF 翻译过程似乎完全删除了该行,它对生成的查询或结果集没有任何影响。

var results = context.Detections
//Line below makes no change ignored by SQL Server. Works when using in memory DB.
//.OrderByDescending(det => det.TimeStamp)
.GroupBy(det => new
{
Year = det.TimeStamp.Year,
Month = det.TimeStamp.Month,
Day = det.TimeStamp.Day,
Hour = det.TimeStamp.Hour,
})
.Select(grp => new
{
Count = grp.Count(),
Detection = grp.OrderByDescending(det => det.TimeStamp).First(),
})
//The following line will not translate
//.OrderByDescending(det => det.Detection.TimeStamp)
.ToList();
如果其中任何一项很重要:
  • Visual Studio 2022 (4.8.04084)
  • .Net 6.0
  • SQL Server 2019 (15.0.2080.9)
  • *所有与 EF 相关的 NuGet 包已更新至 6.0

  • 编辑澄清
    上述代码段生成以下 SQL 查询。
    SELECT [t].[c], [t0].[Id], [t0].[TimeStamp]
    FROM (
    SELECT COUNT(*) AS [c], DATEPART(year, [d].[TimeStamp]) AS [c0], DATEPART(month, [d].[TimeStamp]) AS [c1], DATEPART(day, [d].[TimeStamp]) AS [c2], DATEPART(hour, [d].[TimeStamp]) AS [c3]
    FROM [Detections] AS [d]
    WHERE [d].[TimeStamp] > DATEADD(day, CAST(-16.0E0 AS int), GETUTCDATE())
    GROUP BY DATEPART(year, [d].[TimeStamp]), DATEPART(month, [d].[TimeStamp]), DATEPART(day, [d].[TimeStamp]), DATEPART(hour, [d].[TimeStamp])
    ) AS [t]
    OUTER APPLY (
    SELECT TOP(1) [d0].[Id], [d0].[TimeStamp]
    FROM [Detections] AS [d0]
    WHERE ([d0].[TimeStamp] > DATEADD(day, CAST(-30.0E0 AS int), GETUTCDATE())) AND (((([t].[c0] = DATEPART(year, [d0].[TimeStamp])) AND ([t].[c1] = DATEPART(month, [d0].[TimeStamp]))) AND ([t].[c2] = DATEPART(day, [d0].[TimeStamp]))) AND ([t].[c3] = DATEPART(hour, [d0].[TimeStamp])))
    ORDER BY [d0].[TimeStamp] DESC
    ) AS [t0]
    它产生类似于以下的结果。通知不按时间排序。
    1   628591  2021-11-02 14:34:06.0442966  
    10 628601 2021-11-12 05:43:27.7015291
    150 628821 2021-11-12 21:59:27.6444236
    20 628621 2021-11-12 06:17:13.7798282
    50 628671 2021-11-12 15:17:23.8893856
    如果我添加 ORDER BY [t0].TimeStamp DESC在 Management Studio 中的 SQL 查询结束时,我得到了我正在寻找的结果(见下文)。我只需要知道如何在 LINQ 中编写它。
    150 628821  2021-11-12 21:59:27.6444236  
    50 628671 2021-11-12 15:17:23.8893856
    20 628621 2021-11-12 06:17:13.7798282
    10 628601 2021-11-12 05:43:27.7015291
    1 628591 2021-11-02 14:34:06.0442966
    添加 .OrderByDescending(det => det.Detection.TimeStamp)末前 ToList()是我的第一个想法,但“无法翻译”。我需要对这些结果进行一些分页,所以我真的很想在 SQL 中进行排序。

    最佳答案

    GroupBy 必须自己进行排序,以便“忽略”并非完全出乎意料。
    将其移至分组下方:

    var results = context.Detections
    //.OrderByDescending(det => det.TimeStamp)
    .GroupBy(det => new
    {
    Year = det.TimeStamp.Year,
    Month = det.TimeStamp.Month,
    Day = det.TimeStamp.Day,
    Hour = det.TimeStamp.Hour,
    })
    // .OrderByDescending(grp => grp.Key) // may have to split into y/m/d/h again
    .OrderByDescending(grp => grp.Key.Year)
    .ThenByDescending( grp => grp.Key.Month)
    .ThenByDescending( grp => grp.Key.Day)
    .ThenByDescending( grp => grp.Key.Hour)
    .Select(grp => new
    {
    Count = grp.Count(),
    Detection = grp.OrderByDescending(det => det.TimeStamp).First(),
    })
    .ToList();
    当 EF 支持它时,排序和分组可能会变得更容易一些
    .GroupBy(det => new
    {
    Date = det.TimeStamp.Date,
    Hour = det.TimeStamp.Hour,
    })

    关于c# - GroupBy 与 EF Core 6.0 和 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69998920/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com