Метод должен получать данные с сервера, проверять, были ли добавлены новые токены, и, если есть, добавлять их в базу данных. Если токен уже существует, обновите его статус, но не добавляйте новую строку в таблицу. Это код, который я написал до сих пор.
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();
}
Теперь этот код делает то, что должен, но очень медленно. Как мне его оптимизировать?
Является ли _tokenService внешней службой (например, вызовом db или api для получения этих токенов)?
@Silvermind просто эф 6
Если вы используете EF. Нет необходимости выполнять AddOrUpdate в случае, если сущность уже находится в БД, достаточно SaveChanges
@Dimitar _tokenService вызывает db, сервер вызывает api
В этом случае одним из возможных узких мест является ожидание этой операции ввода-вывода (добавления токена). По возможности рассмотрите возможность добавления метода токенов асинхронно или массово.
Вставить Bluck в таблицу temp и объединить?
Как выглядит метод GetAllTokens? Вы материализуете все токены из своей БД? Это определенно могло убить производительность.





dbTokens.Where (x => x.Symbol == token.Symbol) является IEnumerable
Таким образом, он будет загружать его каждый раз, когда вы вызываете его в цикле. Сохранить в списке перед циклом
List<Token> dbTokens = _tokenService.GetAllTokens().ToList()
Я измерил его, оставаясь таким же медленным.
Какой размер таблицы в db? сколько токенов для обновления или создания отправлено серверами? В соответствии с этим, возможно, весь токен не потребуется загружать в приложение.
270 строк данных и примерно столько же строк, возвращаемых сервером
Вы можете использовать профилировщик sql, чтобы показать сгенерированный запрос sql? также насколько медленный "медленный"? простая вставка базы данных на небольшой стол должна быть чертовски быстрой. Выполняется ли это локально, когда база данных находится на том же компьютере, что и код, который выполняется?
Можете ли вы отслеживать свой код (инструментарий), чтобы определить функцию или вызвать медленную? помог бы.
Это ef core?