通过对象集插入多个记录

时间:2011-09-10 21:29:11

标签: c# sql entity-framework

如果你已经有一个集合,有没有办法在没有循环的情况下插入多个记录?如果你在循环之外提交,那么几乎没有性能上的好处。

我有一个上下文和ObjectSet<Type>。我还有一个Type的集合,我想交换或连接或交叉,或者你有什么表格中的内容。换句话说,我不想从下面开始:

foreach (Type r in Collection)
{
    Context.ObjectSet.Add(r);
}
Context.SaveChanges();

3 个答案:

答案 0 :(得分:2)

您必须始终使用循环。在AddCollectionAddRange这样的方法中没有任何性能优势,因为这些方法通常适用于某些性能优化,其中内部集合扩展到整个范围,并且只是复制而不是为每个{{扩展集合1}}打电话。 Add做的更多,然后将数据传递给某个内部集合,因此它仍然需要逐个处理实体。

如果要优化数据库插入本身的性能,则必须转到另一个解决方案,因为EF没有任何批量或批量数据修改。每条记录作为单个插入传递到单独的往返数据库中。

答案 1 :(得分:1)

您可以尝试创建扩展方法来进行循环和添加。 见下文。

public static class AddHelper 
{


   public void AddAll(this ObjectSet<T> objectSet,IEnumerable<T> items)
   {

        foreach(var item in items)
        {
           objectSet.AddObject(item);

        }

   }

}

然后你可以使用下面的代码。

 IEnumerable<EntityName> list = GetEntities(); //this would typically return your list
 Context.ObjectSet.AddAll(list);

答案 2 :(得分:0)

我正在寻找相同类型的解决方案。

我还没有找到直接使用EF的方法,但有一种方法可以做到。如果创建一个接受DataTable作为参数的存储过程,则可以使用实体上下文执行PROC并将该表作为参数传递。

当您处理数千或数百万条记录时,这比循环传递给DB的每条记录要好得多。

Passing Table Valued Parameters to SQL Server Stored Procedures.