【问题标题】:How to efficiently edit data in a database?如何有效地编辑数据库中的数据?
【发布时间】:2018-11-29 14:09:23
【问题描述】:

该方法应该从服务器接收数据,检查是否添加了新令牌,如果有,则将它们添加到数据库中。如果令牌已存在,请更新其状态但不要在表中添加新行。这是我目前写的代码。

IEnumerable<Token> serverTokens = JsonConvert.DeserializeObject<IEnumerable<Token>>
(server.GetTokens().Content);
IEnumerable<Token> dbTokens = _tokenService.GetAllTokens();

foreach (var token in serverTokens)
    {
        var dbToken = dbTokens.Where(x => x.Symbol == token.Symbol).FirstOrDefault();

        if (dbToken != null)
        {
            Token editedToken = dbToken;
            editedToken.UpdatedOn = DateTime.Now;
            editedToken.Active = token.Active;
            _tokenService.AddToken(editedToken);
        }
        else
        {
            token.UpdatedOn = DateTime.Now;
            _tokenService.AddToken(token);
        }
    }
dbContext.SaveChanges();

AddToken 方法只是一个简单的AddOrUpdate 操作。

public void AddToken(Token token)
        {
            _dbContext.Tokens.AddOrUpdate(token);
            //_dbContext.SaveChanges();
        }

现在,这段代码完成了它应该做的事情,但是它非常慢。我将如何优化它?

【问题讨论】:

  • 这是ef核心吗?
  • _tokenService 是外部服务吗(例如调用 db 或 api 来获取此令牌)?
  • @Silvermind just ef 6
  • 如果您使用的是 EF。如果实体已经在 DB SaveChanges 中,则无需执行 AddOrUpdate
  • @Dimitar _tokenService 调用 db,server 调用 api

标签: c# .net performance entity-framework linq


【解决方案1】:

dbTokens.Where(x => x.Symbol == token.Symbol) 是 IEnumerable

所以每次你在循环中调用它时他都会加载它。 在循环之前存储在列表中

List<Token> dbTokens = _tokenService.GetAllTokens().ToList()

【讨论】:

  • 还是一样慢,我测了一下。
  • db 中表的大小是多少?服务器发送了多少要更新或创建的令牌?据此,可能不需要在应用程序中加载所有令牌。
  • 270行数据,与服务器返回的行数大致相同
  • 你可以使用 sql profiler 来显示生成的 sql 查询吗? “慢”有多慢?在一张小桌子上插入一个简单的数据库应该很快。这是在本地运行的数据库与正在运行的代码在同一台机器上吗?
  • 你能监控你的代码(仪器)来识别慢的函数或调用吗?会有帮助的。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
相关资源
最近更新 更多