2009-07-13 3 views
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(); 

Единственное, что решить эту проблему был явный цикл:Почему этот код Linq всегда вызывает System.StackOverflowException?

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

Это действительно призыв к ASE числовое число, которое генерирует исключение? Yikes - обычно это не делает ничего значительного. Это без фактического повторения этого? –

+0

@ Jon, это было упрощение. Заменяется фактическим кодом. –

+0

@Jeff теперь, когда я решил проблему с явным циклом, я думаю, что он удаляет вину из объекта команд –

ответ

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 - o по часовой стрелке вы получаете ошибку рекурсии.

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

+0

Где это заданные свойства «автоматически сгенерированное значение» и «задержка загрузки»? –

+1

Когда вы открываете dbml в Visual Studio, он открывает визуальный конструктор для ORM. Нажмите на поле (внутри класса) и откройте окно свойств. –

0

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

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

+0

Операция не имеет реализации (кроме {get; set;}) и является «перечислением» –

+0

Хм ... тогда я думаю, что следующей остановкой будет поддержка Microsoft .. что-то о вашей среде приводит к тому, что нижние слои Linq To SQL делают что-то плохое. –

+0

Да, я так думаю. Если бы я мог воспроизвести эту проблему, изолируя другие возможные причины, я мог бы сообщить об этом как об ошибке. –

0

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

Это терпит неудачу с StackOverflowException

Dim iLottery Как IEnumerable (Of лотереи) = С lottery2 В combined2 Где нет (От lottery1 В сочетании Выбрать lottery1.NUMBER) .Contains (lottery2.NUMBER) Выбрать lottery2

Это не

Dim iLottery Как IEnumerable (Of лотереи) = с lottery2 в combined2 Где нет (От lottery1 в сочетании Выбрать lottery1.NUMBER) .equals (lottery2.NUMBER) Выбрать lottery2

Смежные вопросы