Почему этот код Linq всегда вызывает исключение System.StackOverflowException?

2
 //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();
  • 0
    Это действительно вызов AsEnumerable, который вызывает исключение? Yikes - обычно это не делает ничего существенного. Это на самом деле без перебора?
  • 0
    @ Джон, это было упрощением. Заменено на фактический код.
Показать ещё 8 комментариев
Теги:
linq
linq-to-sql
stack-overflow

3 ответа

3
Лучший ответ

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

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

Устойчивость запросов Содержит теперь обнаружение саморегуляции IQueryable и не вызывает переполнение стека

EDIT В .NET 3.5 для решения проблемы: при использовании "Auto Generated Value" = True, вы должны установить "Delay Loaded" в False - в противном случае вы получите ошибку рекурсии.

EDIT2 Решение выше не работает.

  • 0
    Где эти свойства «автоматически сгенерированное значение» и «задержка загрузки» установить?
  • 1
    Когда вы открываете dbml в Visual Studio, он открывает визуальный дизайнер для ORM. Нажмите на поле (внутри класса) и откройте окно свойств.
0

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

Это не выполняется с помощью StackOverflowException

Dim iLottery Как IEnumerable (из лотереи) = Из лотереи2 В комбинированном2, где нет (из лотереи1 В комбинированном выборе лотереи1.NUMBER). Консоли (лотерея2.NUMBER) Выберите лотерею2

Это не

Dim iLottery Как IEnumerable (из лотереи) = Из лотереи2 В комбинированном2, где нет (из лотереи1 В комбинации Выберите лотерею1.NUMBER).Equals(lottery2.NUMBER) Выберите лотерею2

0

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

Какова реализация свойства Operation? Возможно, это рекурсивное обращение к другому коду.

  • 0
    Операция не имеет реализации (кроме {get; set;}) и является "перечислением"
  • 0
    Хм ... тогда я думаю, что вашей следующей остановкой будет поддержка Microsoft ... что-то в вашей среде заставляет нижние уровни Linq To SQL что-то делать неправильно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню