InvalidOperationException:LINQ 表达式无法翻译,即使我使用了 ToListAsync()



我的仓库里有这段代码:

public async Task<IndexViewModel> GetAllPosts(int pageNumber, string category)
{
Func<Post, bool> InCategory = (post) => post.Category.Equals(category, StringComparison.OrdinalIgnoreCase);
int pageSize = 5;
int skipAmount = pageSize * (pageNumber - 1);
var query = dbContext.Posts.AsQueryable();
if (!String.IsNullOrEmpty(category))
query = query.Where(x => InCategory(x));
return new IndexViewModel()
{
Posts = await query
.Skip(skipAmount)
.Take(pageSize)
.ToListAsync()
}; 
}

我收到此错误:

处理

请求时发生未处理的异常。

InvalidOperationException: LINQ 表达式 'DbSet .其中(p => Invoke(__InCategory_0, p[Post]) )' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/linkid=2101038。

Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.g__CheckTranslated|8_0(ShapedQueryExpression translated, ref <>c__DisplayClass8_0 )

现在,尽管我使用了.ToListAsync(),但它告诉我在错误中使用。如何解决此问题?

如果您希望在服务器端执行,则必须使用Expression。此外,通常,数据库具有不敏感的排序规则,您不必担心大小写。

public async Task<IndexViewModel> GetAllPosts(int pageNumber, string category)
{
Expression<Func<Post, bool>> InCategory = (post) => post.Category == category;
int pageSize = 5;
int skipAmount = pageSize * (pageNumber - 1);
var query = dbContext.Posts.AsQueryable();
if (!String.IsNullOrEmpty(category))
query = query.Where(InCategory);
return new IndexViewModel()
{
Posts = await query
.Skip(skipAmount)
.Take(pageSize)
.ToListAsync()
}; 
}

由于必须将大量数据加载到内存中而性能较差的 LINQ 查询似乎被 EFCore 阻止。

如果我们必须在过滤数据之前调用AsEnumerable(),我们仍然可以显式执行此操作,例如:

var blogs = context.Blogs
.AsEnumerable()
.Where(blog => StandardizeUrl(blog.Url).Contains("dotnet"))
.ToList();

除非数据很小,否则不建议这样做,因为此示例中的所有Blogs都加载到内存中。

了解更多信息

最新更新