回到目錄
批量插入在EF時代大叔就自己封裝過,原理是将多次SQL連接配接和多次向SQL發送的指令減少到1次,或者1000條資料1次,而對于EF産生的語句來說,這無疑是性能高效的,因為EF這邊在處理時,每個語句都會向SQL發送一次,當然就算它是在一個SQL連接配接裡,向SQL發送N多條指令,也是性能低下的。
對于MongoDB來說也是一樣,如何減少與Mongo通信的次數,是提高插入操作的前提,還好,官方驅動為我們繼承了這個功能,使用WriteModel類型來存儲要插入的集合,使用InsertOneModel類型來承載要插入的對象,這一切都很直覺,代碼也很清晰!
public void Insert(IEnumerable<TEntity> item)
{
var list = new List<WriteModel<TEntity>>();
foreach (var iitem in item)
{
list.Add(new InsertOneModel<TEntity>(iitem));
}
_table.BulkWriteAsync(list).Wait();
}
而測試完批量添加後,就做了批量更新和删除,不過遺憾的是,都失敗的,下面公開一個失敗的代碼,如果大家有解決方案,歡迎留言!
public void Update(IEnumerable<TEntity> item)
{
var list = new List<WriteModel<TEntity>>();
foreach (var iitem in item)
{
var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString()));
list.Add(new UpdateOneModel<TEntity>(query, Builders<TEntity>.Update.Combine(GeneratorMongoUpdate(iitem))));
}
_table.BulkWriteAsync(list).Wait();
}
public void Delete(IEnumerable<TEntity> item)
{
var list = new List<WriteModel<TEntity>>();
foreach (var iitem in item)
{
var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString()));
list.Add(new DeleteOneModel<TEntity>(query));
}
_table.BulkWriteAsync(list).Wait();
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
