【发布时间】:2020-05-14 20:46:48
【问题描述】:
当我使用 GroupBy 作为对 EFCore 的 LINQ 查询的一部分时,我收到错误 System.InvalidOperationException: Client-side GroupBy is not supported。
这是因为 EF Core 3.1 尝试尽可能多地在服务器端评估查询,而不是在客户端评估它们,并且调用无法转换为 SQL。
所以下面的语句不起作用,会产生上面提到的错误:
var blogs = await context.Blogs
.Where(blog => blog.Url.Contains("dotnet"))
.GroupBy(t => t.BlobNumber)
.Select(b => b)
.ToListAsync();
现在显然解决方案是在调用 GroupBy() 之前使用 .AsEnumerable() 或 .ToList(),因为这明确告诉 EF Core 您想要进行分组客户端。有一个关于这个on GitHub和in the Microsoft docs的讨论。
var blogs = context.Blogs
.Where(blog => blog.Url.Contains("dotnet"))
.AsEnumerable()
.GroupBy(t => t.BlobNumber)
.Select(b => b)
.ToList();
但是,这不是异步的。我怎样才能使它异步?
如果我将 AsEnumerable() 更改为 AsAsyncEnumerable(),则会收到错误消息。如果我尝试将 AsEnumerable() 更改为 ToListAsync() 则 GroupBy() 命令失败。
我正在考虑将它包装在 Task.FromResult 中,但这实际上是异步的吗?还是数据库查询还是同步的,只有后面的分组是异步的?
var blogs = await Task.FromResult(context.Blogs
.Where(blog => blog.Url.Contains("dotnet"))
.AsEnumerable()
.GroupBy(t => t.BlobNumber)
.Select(b => b)
.ToList());
或者如果这不起作用,还有其他方法吗?
【问题讨论】:
-
即使不存在,问题似乎仍然存在。 (上面的例子只是我从别处复制和粘贴的一个例子。我的实际代码不使用那个函数。)
-
好的,你应该明确提到这一点。我会删除我的评论。那么。
-
不管怎样,我认为如果使用 AsEnumerable 可以如此轻松地解决问题,那么必须有另一种简单的方法来做到这一点,但异步。我只是不知道它是什么。
-
我已经简化了示例以去掉该功能。
-
@PanagiotisKanavos 同样,示例查询中具体的
Select对于所提出的问题(即 "How to use GroupBy in an )并不重要>EF Core 3.1 中的>异步方式?”
标签: c# asp.net-core entity-framework-core ef-core-3.1