0

このコードが機能しないのはなぜですか?オブジェクトを挿入しますが、削除しません

public int Toggle(RequestArchive RequestArchiveObj)
{
   var ra = DataContext.RequestArchives.Where(rec => rec.UserId == RequestArchiveObj.UserId && rec.RequestId == RequestArchiveObj.RequestId);

   if(ra.Count() > 0)
   {
        foreach (var item in ra)
        {                    
            DataContext.DeleteObject(item);
        }
   }
   else
   {
        DataContext.AddToRequestArchives(RequestArchiveObj);
   }

   DataContext.SaveChanges();
   return RequestArchiveObj.Id;
}
4

1 に答える 1

1

コードに潜在的に危険な問題があり、問題はそれに関連している可能性があります。

クエリオブジェクト(によって返されるオブジェクトDataContext.RequestArchives.Where())を実行せずにループすると、ループ内のすべてのアイテムについてデータベースへのラウンドトリップが発生します。これは、N+1選択問題と呼ばれます。

ToList()次の方法を使用して、これを軽減できます。

var ra = DataContext.RequestArchives
                    .Where(rec => 
                           rec.UserId == RequestArchiveObj.UserId && 
                           rec.RequestId == RequestArchiveObj.RequestId)
                    .ToList(); // this executes the query
// ...
foreach (var item in ra) // without ToList() this will query every item by itself
{                    
    DataContext.DeleteObject(item); // and this might collide with the query
}

これについてはよくわかりませんが、foreachループを介してオブジェクトをクエリしているときにオブジェクトを削除しようとすると、削除の問題が発生する可能性があります。ToList()その場合は、上記の推奨事項を使用すると機能するはずです。

于 2012-11-08T14:09:15.503 に答える