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

3 に答える 3

3

これは本当にバグであり、LINQ 4.0 で修正されました。

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

クエリの安定性 Contains が自己参照 IQueryable を検出し、スタック オーバーフローを引き起こさないようになりました

問題を解決するために.NET 3.5で編集:「自動生成値」= Trueを使用する場合、「遅延ロード」をFalseに設定する必要があります-そうしないと、再帰エラーが発生します。

EDIT2上記の解決策は機能しませんでした。

于 2009-07-14T17:34:31.433 に答える
0

最後の行にブレークポイントを置き、コードを実行します。次に、ブレークポイントで停止したら、そのコード チャンクの先頭に別のブレークポイントを追加します。次に、デバッガーで続行します (ステップ オーバー)。新しいブレークポイントにヒットするはずです。スタックを調べて、それ自体がどのようにコールバックされたかを確認できます。

Operationプロパティの実装は何ですか?おそらく、それは再帰的な方法で他のコードにコールバックします。

于 2009-07-13T14:20:28.987 に答える
0

これはすでに古い投稿であることは知っていますが、Contains メソッドを Equals に変更することもできました。

これは StackOverflowException で失敗します

Dim iLottery As IEnumerable(Of Lottery) = 組み合わせた 2 の宝くじ 2 から、組み合わせた 2 ではなく (宝くじ 1 から組み合わせて、宝くじ 1.NUMBER を選択).Contains(宝くじ 2.NUMBER) 宝くじ 2 を選択

これはしません

Dim iLottery As IEnumerable(Of Lottery) = Lottery2 から 組み合わせた 2 Where Not (From lottery1 組み合わせて Lottery1.NUMBER を選択).Equals(lottery2.NUMBER) Lottery2 を選択

于 2013-01-16T20:42:51.367 に答える