我有一个可以在 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 以外的其他东西来获得所需的结果集吗?
由于您没有选择时间戳,请在选择之前移动它
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。
您查询的类型是错误的,它是返回类型而不是包含原始数据的类型。你想要这样的东西:
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)
归档时间: |
|
查看次数: |
87 次 |
最近记录: |