如何将我的工作 SQL 查询转换为 Linq (C#)?

ews*_*001 1 .net c# linq

我有一个可以在 SQL Server 上返回我想要的结果的工作 SQL 查询:

SELECT
  SUM(CriticalCount) As CriticalCount,
  SUM(HighCount) As HighCount,
  SUM(MediumCount) As MediumCount,
  SUM(LowCount) As LowCount,
  Timestamp
FROM [dbo].[TicketCounts]
GROUP BY Timestamp
ORDER BY Timestamp DESC
Run Code Online (Sandbox Code Playgroud)

结果集是:

临界计数 高计数 中数 低计数 时间戳
32 15 18 3 2021-07-01 11:00:00
24 10 42 15 2021-06-30 10:00:00

在我TicketCountRepository的 .Net Core 5.0 项目中,我希望此方法返回相同的结果:

public async Task<IEnumerable<TicketCount>> GetTicketCounts()
{
  return await _dbContext.TicketCounts
      .GroupBy(o => o.Timestamp)
      .Select(tc => new TicketCount
      {
        CriticalCount = tc.Sum(o => o.CriticalCount),
        HighCount = tc.Sum(o => o.HighCount),
        MediumCount = tc.Sum(o => o.MediumCount),
        LowCount = tc.Sum(o => LowCount)
      }).OrderByDescending(o => o.Timestamp).toListAsync();
}
Run Code Online (Sandbox Code Playgroud)

代码编译得很好,但是当我在TicketCount控制器中点击这个方法时,我得到一个 500 错误:

System.InvalidOperationException:LINQ 表达式 DbSet().GroupBy(keySelector: o => o.Timestamp, elementSelector o => o).Select(e => new TicketCount { CriticalCount = e.Sum(s => s.CriticalCount) , HighCount = e.Sum(s => s.HighCount), MediumCount = e.Sum(s => s.MediumCount), LowCount = e.Sum(s => s.LowCount)}).OrderByDescending(e0 => e0.Timestamp) 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用,显式切换到客户端评估。

我究竟做错了什么?我应该使用 linq 以外的其他东西来获得所需的结果集吗?

Ser*_*rge 5

由于您没有选择时间戳,请在选择之前移动它

return await _dbContext.TicketCounts
      .GroupBy(o => o.Timestamp)
       .OrderByDescending(o => o.Timestamp)
      .Select(tc => new TicketCount
      {
        CriticalCount = tc.Sum(o => o.CriticalCount),
        HighCount = tc.Sum(o => o.HighCount),
        MediumCount = tc.Sum(o => o.MediumCount),
        LowCount = tc.Sum(o => LowCount)
      }).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

或者您可以尝试将 Timestamp 属性添加到 TicketCount 并将其添加到 Select。


Jam*_*Ide 5

您查询的类型是错误的,它是返回类型而不是包含原始数据的类型。你想要这样的东西:

  return await _dbContext.Tickets
  .GroupBy(o => o.Timestamp)
  .Select(x => new TicketCount
  {
    Timestamp = x.Key,
    CriticalCount = x.Sum(o => o.CriticalCount),
    HighCount = x.Sum(o => o.HighCount),
    MediumCount = x.Sum(o => o.MediumCount),
    LowCount = x.Sum(o => LowCount)
  }).OrderByDescending(x => x.Timestamp).toListAsync();
Run Code Online (Sandbox Code Playgroud)