如果你已经有一个集合,有没有办法在没有循环的情况下插入多个记录?如果你在循环之外提交,那么几乎没有性能上的好处。
我有一个上下文和ObjectSet<Type>
。我还有一个Type
的集合,我想交换或连接或交叉,或者你有什么表格中的内容。换句话说,我不想从下面开始:
foreach (Type r in Collection)
{
Context.ObjectSet.Add(r);
}
Context.SaveChanges();
答案 0 :(得分:2)
您必须始终使用循环。在AddCollection
或AddRange
这样的方法中没有任何性能优势,因为这些方法通常适用于某些性能优化,其中内部集合扩展到整个范围,并且只是复制而不是为每个{{扩展集合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.