为什么这个Linq代码总是抛出System.StackOverflowException?

//A query to a local object var deletionCommands = commands .Where(a => a.Operation != Operation.Addition) .Select(a => new { a.Prestador.cod_prestador, a.Prestador.cod_desdobramento }) ; //A Linq-To-SQL query var toDelete = db.Prestadors .Where(a => deletionCommands.Contains(new { a.cod_prestador, a.cod_desdobramento })) ; db.Prestadors.DeleteAllOnSubmit(toDelete); db.SubmitChanges(); 

解决问题的唯一方法是显式循环:

  foreach (var command in commands) { if(command.Operation != Operation.Addition) { var toDelete = db.Prestadors .Where(a => a.cod_prestador == command.Prestador.cod_prestador && a.cod_desdobramento == command.Prestador.cod_desdobramento ); db.Prestadors.DeleteAllOnSubmit(toDelete); } } db.SubmitChanges(); 

这真的是一个错误,并在LINQ 4.0中得到纠正

http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

查询稳定性包含现在检测自引用IQueryable并且不会导致堆栈溢出

编辑在.NET 3.5中解决问题:当使用“自动生成的值”= True时,必须将“延迟加载”设置为False – 否则会出现递归错误。

EDIT2上面的解决方案不起作用。

在最后一行放置一个断点,然后运行代码。 然后当它在断点处停止时,在该代码块的开头添加另一个断点。 然后继续在调试器中(跳过)。 它应该命中新的断点,你可以检查堆栈,看看它是如何回调自身的。

什么是Operation属性的实现? 也许这会以递归方式回调其他代码。

我知道这是一个旧post,但将Contains方法更改为Equals也适用于我。

这与StackOverflowException失败

昏暗的iLottery作为IEnumerable(彩票)=来自lottery2 in combined2 Where Not Not(来自lottery1 In Combined Select lottery1.NUMBER).Contains(lottery2.NUMBER)Select lottery2

这没有

昏暗的iLottery因为IEnumerable(彩票)=来自lottery2 in combined2 Where Not Not(来自lottery1 In Combined Select lottery1.NUMBER).Equals(lottery2.NUMBER)选择彩票2