首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF:按Id更新字段的最佳/最快方式

EF:按Id更新字段的最佳/最快方式
EN

Stack Overflow用户
提问于 2017-02-07 16:50:14
回答 1查看 49关注 0票数 1

目前,来自的数据库记录被加载到一个简化的模型中,该模型也存储ID-key。经过一些计算后,需要更新原始记录的一个或多个字段。

模型非常大(有很多字符串),每个表的条目数可能超过100.000个。因此,将它们加载到内存中会将结果加载到OutOfMemoryException中。

代码语言:javascript
复制
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)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-07 16:55:55

每次使用FirstOrDefault()时,您都会运行新的数据库查询。您可以在一个查询中加载所有实体:

代码语言:javascript
复制
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);

然后,您可以使用内存中加载的条目,而无需额外的数据库查询。例如。

代码语言:javascript
复制
 foreach( var simpleModel in simpleModels )
 {
      Model entry;
      if (!entriesById.TryGetValue(simpleModel.Id, out entry))
         continue;

      entry.Field = simpleModel.Field;
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42085372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档