如何有效地编辑数据库中的数据?

时间:2018-11-29 14:09:23

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

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

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();
        }

现在,此代码可以完成预期的工作,但是它非常慢。我将如何对其进行优化?

1 个答案:

答案 0 :(得分:2)

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

因此,每次您在循环上调用它时,他都会加载它。 在循环之前将其存储在列表中

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