为什么这样的LINQ code总是抛出System.StackOverflowException? [英] Why this Linq code always throws System.StackOverflowException?

查看:367
本文介绍了为什么这样的LINQ code总是抛出System.StackOverflowException?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  //查询到本地的对象
 VAR deletionCommands =命令
     。凡(一个=>!a.Operation = Operation.Addition)
     。选择(A =>新建{。一个prestador.cod_ prestador,一个prestador.cod_desdobramento})
     ;
 //一个LINQ到SQL查询
 VAR toDelete = DB。prestadors
     。凡(A => deletionCommands.Contains(新{a.cod_ prestador,a.cod_desdobramento}))
     ;
 DB prestadors.DeleteAllOnSubmit(toDelete)。
 db.SubmitChanges();
 

这是解决问题的唯一事情是明确的循环:

 的foreach(在命令VAR命令)
 {
    如果(command.Operation!= Operation.Addition)
    {
        VAR toDelete = DB。prestadors
            。凡(一个=>
                a.cod_ prestador ==命令prestador.cod_ prestador和放大器;&安培;
                a.cod_desdobramento ==命令。prestador.cod_desdobramento
            );
        DB prestadors.DeleteAllOnSubmit(toDelete)。
    }
 }
 db.SubmitChanges();
 

解决方案

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

的http:// damieng。 COM /博客/ 2009/06/01 / LINQ到SQL的变化,在净40

  

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

修改在.NET 3.5中解决这个问题:当使用自动生成的值'= TRUE,则必须将延迟加载'为False - 否则,你得到的递归错误。

EDIT2 上述方案没有奏效。

 //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();

The only thing that solved the problem was an explicit loop:

 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();

解决方案

That was really a bug, and was corrected in LINQ 4.0

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

Query stability Contains now detects self-referencing IQueryable and doesn't cause a stack overflow

EDIT In .NET 3.5 to resolve the problem: When using 'Auto Generated Value' = True, then you must set 'Delay Loaded' to False - otherwise you get the recursion error.

EDIT2 The solution above didn't work.

这篇关于为什么这样的LINQ code总是抛出System.StackOverflowException?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆