gpt4 book ai didi

c# - EF : Best/Quickest way to update field by Id

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:48 25 4
gpt4 key购买 nike

目前,来自 get 的数据库记录被加载到一个简化的模型中,该模型还存储了 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(没有直接的字符串-sql-查询)来加快速度?

最佳答案

每次您使用 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;
}

关于c# - EF : Best/Quickest way to update field by Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42085372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com