Servicestack - Ormlite - 大容量数据加载
Servicestack - Ormlite - high volume data loading
我在高数据加载情况下遇到 Servicestack 和 OrmLite 的一些问题。
具体来说,
1. 我有一个包含 1000 000 个实体的列表
2. 如果记录尚不存在
,我想将它们插入 Db(使用 Sql 服务器)
因此,
public class Entity
{
[Autoincrement]
public int Id {get;set;}
public string Name {get;set;}
public string Address {get;set;}
}
现在是导入逻辑,
List<Entity> entities = oneMillionEntities.ToList();
foreach (var entity in entities)
{
if (!db.Exists<Entity>(ar => ar.Address == entity.Address))
{
db.Save(entity);
}
}
问题是数据库经常忙于保存操作,因此 db.Exists 并不总是产生正确的结果。处理这些情况的最佳方法是什么?
尝试
// Prepare SqlExpression
var ev = Db.From<Entity>().Select(p => p.Address).GroupBy(p => p.Address);
// Execute SqlExpression and transform result to HashSet
var dbAddresses = Db.SqlList(ev).ToHashSet();
// Filter local entities and get only local entities with different addresses
var filteredEntities = oneMillionEntities.Where(p =>
!dbAddresses.Contains(p.Address));
// Bulk insert
db.InsertAll(filteredEntities.ToList());
我在高数据加载情况下遇到 Servicestack 和 OrmLite 的一些问题。
具体来说,
1. 我有一个包含 1000 000 个实体的列表
2. 如果记录尚不存在
因此,
public class Entity
{
[Autoincrement]
public int Id {get;set;}
public string Name {get;set;}
public string Address {get;set;}
}
现在是导入逻辑,
List<Entity> entities = oneMillionEntities.ToList();
foreach (var entity in entities)
{
if (!db.Exists<Entity>(ar => ar.Address == entity.Address))
{
db.Save(entity);
}
}
问题是数据库经常忙于保存操作,因此 db.Exists 并不总是产生正确的结果。处理这些情况的最佳方法是什么?
尝试
// Prepare SqlExpression
var ev = Db.From<Entity>().Select(p => p.Address).GroupBy(p => p.Address);
// Execute SqlExpression and transform result to HashSet
var dbAddresses = Db.SqlList(ev).ToHashSet();
// Filter local entities and get only local entities with different addresses
var filteredEntities = oneMillionEntities.Where(p =>
!dbAddresses.Contains(p.Address));
// Bulk insert
db.InsertAll(filteredEntities.ToList());