我目前正在开发一个最近获得了许多数据库记录的项目。我现在正在努力为此进行优化。这是我的模特:
public class QueueEntity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<PhraseEntity> Phrases { get; set; }
}
public class PhraseEntity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual SourceEntity Source { get; set; }
public virtual List<QueueEntity> Queues { get; set; }
}
public class SourceEntity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<PhraseEntity> Phrases { get; set; }
}
我现在正在测试大约100,000个短语记录,并说这些短语的每两万个增量属于不同的来源。
用户可以从队列中添加和删除“来源”;基本上,我只是添加或删除从源到队列的所有短语。这种结构不是我的选择,现在改变它已经太迟了。
这些保存和删除现在导致我的测试系统崩溃,因为我似乎无法访问队列中的短语而不将其拉入内存。即使尝试批量删除(例如context.Queues.Single(m => m.Id == queueId).Phrases.Take(1000);
或将1000个短语的IQueryable存储为变量“短语”并执行context.Queues.Single(m => m.Id == queueId).Phrases.RemoveAll(m => phrases.Contains(m));
),我似乎试图将该队列上的所有短语记录拉入内存
是否有一种更简单的方法可以在使用LINQ表达式的同时删除这些记录之间的关系?
答案 0 :(得分:0)
如果其他人在同一问题上遇到这个问题,我们决定不在这种情况下使用ORM。我们刚写了两个SQL存储过程(一个用于添加,一个用于删除),这简化了问题并极大地提高了效率。在使用100,000多条记录进行测试时,如果没有丢失内存异常,则需要花费大量时间来完成操作。通过存储过程,我们的操作在几秒或更短的时间内完成。这种方法的唯一缺点来自可测试性的观点。