Почему этот код Linq всегда вызывает исключение System.StackOverflowException? - PullRequest
2 голосов
/ 13 июля 2009
 //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();

Ответы [ 3 ]

3 голосов
/ 14 июля 2009

Это была действительно ошибка, и она была исправлена ​​в LINQ 4.0

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

стабильность запросов Contains теперь обнаруживает IQueryable с самоссылкой и не вызывает переполнение стека

РЕДАКТИРОВАТЬ В .NET 3.5 для решения проблемы: При использовании «Auto Generated Value» = True вы должны установить «Delay Loaded» в False - в противном случае вы получите ошибку рекурсии.

РЕДАКТИРОВАТЬ2 Решение выше не сработало.

0 голосов
/ 17 января 2013

Я знаю, что это уже старый пост, но изменение метода Contains на Equals также сработало для меня.

Это не работает с StackOverflowException

Dim iLottery As IEnumerable (Of lottery) = Из лотереи2 В комбинированном2 Где Not (Из лотереи1 В комбинированном Выберите лотерею1.NUMBER). Содержит (lottery2.NUMBER) Выберите лотерею2

Это не

Dim iLottery As IEnumerable (Of lottery) = Из лотереи2 В комбинированном2 Где Not (Из лотереи1 В комбинированном Выберите лотерею1.NUMBER) .Equals (lottery2.NUMBER) Выберите лотерею2

0 голосов
/ 13 июля 2009

Поставьте точку останова в последней строке, затем запустите код. Затем, когда он останавливается на точке останова, добавьте еще одну точку останова в начале этого фрагмента кода. Затем продолжите в отладчике (шаг за шагом). Он должен достичь новой точки останова, и вы можете проверить стек, чтобы увидеть, как он вызвал сам себя.

Какая реализация свойства Operation? Может быть, это рекурсивно вызывает обратный вызов какого-то другого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...