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 回答