System.InvalidOperationException: '无法翻译 LINQ 表达式。要么以可以翻译的形式重写查询

System.InvalidOperationException: 'The LINQ expression could not be translated. Either rewrite the query in a form that can be translated

我正在尝试通过使用下面的方法获取所有不是蓝色的笔 表达。有两个列表 pens 和 bluepens...

var pensToDelete = _repository.GetPens().Where(x => bluePens.All(y => y.Id != x.Id));

当我如下访问 pensToDelete 时

if (pensToDelete .Count() > 0)
{
}

我收到以下错误:

System.InvalidOperationException: 'The LINQ expression 'DbSet() .Where(a => __bluePens_0 .All(y => y.Id != a.Id))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'.

不确定如何解决这个问题

问题可以很快解决,如错误消息中所述,通过使用例如 ToList.

枚举结果

这样做的缺点是它将在内存中处理,而不是在您的 SQL 服务器中处理。

如果可以接受,请按以下方法操作;

var pensToDelete = _repository.GetPens().ToList()
                              .Where(x => bluePens.All(y => y.Id != x.Id));

为了在 LINQ 中使用表达式,当您获得 InvalidOperationException 时,它必须可以转换为基础提供程序,这可能是因为无法将 LINQ 表达式转换为等效的 SQL Query

正如我们在评论中讨论的那样,当你想使用 ToList() 时要小心,总是尝试在你的主查询之后使用它,因为它是昂贵的并且在 Where().Tolist() 之类的东西之前检索所有记录不是ToList().Where()

这个怎么样:

var pensToDelete = _repository.GetPens()
                              .Where(x => !bluePens.Select(s => s.Id).Contains(x.Id));