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));
我正在尝试通过使用下面的方法获取所有不是蓝色的笔 表达。有两个列表 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));