当我在LINQ查询中使用GroupBy作为EFCore的一部分时,会出现错误System.InvalidOperationException:不支持客户端GroupBy。
这是因为EF Core 3.1尽可能地在服务器端评估查询,而不是在客户端评估它们,并且该调用无法转换为SQL。
因此,以下语句无法正常工作,并产生上述错误:
如果这不起作用,还有其他方法吗?
这是因为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你想在客户端进行分组。有关此问题的讨论可以在GitHub上和Microsoft文档中找到。
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());
如果这不起作用,还有其他方法吗?
Select(b=>b)
不应该 取消分组 吗? - Panagiotis KanavosSelect(b => b)
并没有实际作用,可以跳过(对问题来说并不重要)。问题在于在GroupBy
前面放什么内容,以及如何让代码在客户端编译和执行。 - Ivan StoevSelect
对于所提出的问题并不重要,该问题是:“如何在EF Core 3.1中以异步方式使用GroupBy?” - Ivan Stoev