在使用块内部,需要处理并重新实现

dur*_*rsk 2 c# linq entity-framework

我正在尝试使用EF增强将数千行写入数据库的性能.我发现SaveChanges()的速度会在单个上下文中随着时间的推移而降低,并且在n个插入之后处理和重新创建上下文可以帮助解决这个问题.

using(Context context = new Context())
{
    for(int i = 0; i < numberOfLines; i++)
    {
        context.Collection.AddObject(line);
        if (i % 100 == 0)
        {
            context.SaveChanges()
            // Here I would like to call dispose on context and then create a new one
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

当然,我需要使用或执行类似的操作,因为还有很多事情要发生,我需要确保在任何时候抛出异常时都会调用dispose.

有任何想法吗?我知道我可以在try块之外声明上下文,然后使用context.Dispose()得到一个finally.我显然不想这样做.

编辑:我意识到我发布的代码片段并没有完全显示我为什么要这样做.for循环在IF语句之外的其他位置调用context.SaveChanges().因此,当IF评估为true时,我已经多次调用SaveChanges().

Jon*_*eet 5

听起来你基本上想要批量处理一个集合.使用MoreLINQ(也在NuGet上)很简单:

foreach (var batch in dataToUpload.Batch(100))
{
    using (var context = new Context())
    {
        foreach (var item in batch)
        {
            ...
        }
        context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

除了其他任何东西,它比使用一个带有检查的循环更清楚地描述了你想要实现的目标(IMO)i % 100.

(http://morelinq.googlecode.com的原始链接不再有效,替换为当前的GitHub链接)