我正在尝试使用以下方法获取所有非蓝色笔表示有两个列表笔和蓝笔。。。
var pensToDelete = _repository.GetPens().Where(x => bluePens.All(y => y.Id != x.Id));
当我访问以下的pensToDelete时
if (pensToDelete .Count() > 0)
{
}
我得到以下错误:
系统。InvalidOperationException:"LINQ表达式"DbSet((.其中(a=>__bluePens_0.All(y=>y.Id!=a.Id(('无法翻译。以可翻译的形式重写查询,或者切换到通过插入对"AsEnumerable"的调用显式地进行客户端评估,"AsAsyncEnumerable"、"ToList"或"ToListAsync"。
不确定如何修复此
为了在LINQ中使用表达式,当您获得InvalidOperationException
时,它必须可翻译到底层提供程序,这可能是因为无法将LINQ
表达式翻译为等效的SQL Query
。
正如我们在评论中所讨论的,当您想要使用ToList()
时要小心,始终尝试在主查询之后使用它,因为它成本高昂,并且在任何类似Where().Tolist()
而不是ToList().Where()
的东西之前检索所有记录
这个怎么样:
var pensToDelete = _repository.GetPens()
.Where(x => !bluePens.Select(s => s.Id).Contains(x.Id));
如错误消息中所述,通过使用例如:ToList
枚举结果,可以很快解决问题。
这样做的缺点是它将在内存中处理,而不是在SQL服务器中处理。
如果这是可以接受的,这就是如何做到的;
var pensToDelete = _repository.GetPens().ToList()
.Where(x => bluePens.All(y => y.Id != x.Id));