目前,来自的数据库记录被加载到一个简化的模型中,该模型也存储ID-key。经过一些计算后,需要更新原始记录的一个或多个字段。
模型非常大(有很多字符串),每个表的条目数可能超过100.000个。因此,将它们加载到内存中会将结果加载到OutOfMemoryException中。
class Model // Database-Table
{
public Int Id { get; set; }
public int Field { get; set; }
}
class SimpleModel
{
int Id;
int Field;
}
void Update( SimpleModel[] simpleModels )
{
using( var ctx = new DbContext() )
{
foreach( var simpleModel in simpleModels )
{
var entry = ctx.ModelTable
.Where( x => x.Id == simpleModel.Id )
.FirstOrDefault();
if( entry == null )
continue;
ctx.ModelTable.Attach( entry );
entry.Field = simpleModel.Field;
}
if( ctx.ChangeTracker.HasChanges() )
ctx.SaveChanges();
}
}然而,这是非常缓慢的。有没有一种方法可以加速这一过程,使用EntityFramework (不直接使用string-sql-queries)?
发布于 2017-02-07 16:55:55
每次使用FirstOrDefault()时,您都会运行新的数据库查询。您可以在一个查询中加载所有实体:
var ids = simpleModels.Select(sm => sm.Id);
var entries = ctx.ModelTable.Where(m => ids.Contains(m.Id)).ToList();
// or
var entriesById = ctx.ModelTable.Where(m => ids.Contains(m.Id)).ToDictionary(x => x.Id);然后,您可以使用内存中加载的条目,而无需额外的数据库查询。例如。
foreach( var simpleModel in simpleModels )
{
Model entry;
if (!entriesById.TryGetValue(simpleModel.Id, out entry))
continue;
entry.Field = simpleModel.Field;
}https://stackoverflow.com/questions/42085372
复制相似问题