所以我需要导入(目前)大约15k的产品。每个产品都有20个属性,以及属于其他表的信息 - 例如,用于此产品的仓库。为了避免多次保存相同的信息,我创建了一个Warehouse表,其中包含地址,名称和ID。名称和地址是我运行的导入中列出的名称和地址。
现在,数据库中可能已存在或可能尚未存在与产品相关的其他链接数据。
我目前这样做的方法是检查相关条目是否存在,因为我来了,如果不存在,我使用另一个上下文将它们添加到数据库并返回新生成的实体的id。实际产品将添加到“主”上下文中,并在添加完所有后保存。像这样:
using (var context = new MyContext())
{
foreach (var product in productList)
{
CheckWarehouse(product);
CreateEntityFromProduct(product);
}
context.SaveChanges();
}
虽然这在某种程度上适用于当前的数据量,但它仍然相当慢,所以我想知道,有什么更好的方法可以解决这个问题?
答案 0 :(得分:1)
Linq对于大量数据并不是那么好。你可以做一个小插图。这是一个支持大量数据的建议:
void Main()
{
//Your list of objects
List<MyObject> TheListOfMyObjects=new List<MyObject>();
var dt=new DataTable();
dt.Columns.Add("Prop1",typeof(int));
dt.Columns.Add("Prop2",typeof(string));
foreach (var TheObject in TheListOfMyObjects)
{
dt.Rows.Add(TheObject.Prop1,TheObject.Prop2);
}
InsertWithBulk(dt,"YourConnnectionString","MyObject");
}
private void InsertWithBulk(DataTable dt,string connectionString,string tableName)
{
using (SqlConnection destinationConnection =new SqlConnection(connectionString))
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName =tableName;
try
{
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
//Exception from the bulk copy
}
}
}
}