Как эффективно редактировать данные в базе данных?

Метод должен получать данные с сервера, проверять, были ли добавлены новые токены, и, если есть, добавлять их в базу данных. Если токен уже существует, обновите его статус, но не добавляйте новую строку в таблицу. Это код, который я написал до сих пор.

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 core?

Silvermind 29.11.2018 15:13

Является ли _tokenService внешней службой (например, вызовом db или api для получения этих токенов)?

Dimitar 29.11.2018 15:15

@Silvermind просто эф 6

blablubla12 29.11.2018 15:16

Если вы используете EF. Нет необходимости выполнять AddOrUpdate в случае, если сущность уже находится в БД, достаточно SaveChanges

Mikhail 29.11.2018 15:16

@Dimitar _tokenService вызывает db, сервер вызывает api

blablubla12 29.11.2018 15:18

В этом случае одним из возможных узких мест является ожидание этой операции ввода-вывода (добавления токена). По возможности рассмотрите возможность добавления метода токенов асинхронно или массово.

Dimitar 29.11.2018 15:23

Вставить Bluck в таблицу temp и объединить?

Drag and Drop 29.11.2018 15:39

Как выглядит метод GetAllTokens? Вы материализуете все токены из своей БД? Это определенно могло убить производительность.

Fran 29.11.2018 15:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

dbTokens.Where (x => x.Symbol == token.Symbol) является IEnumerable

Таким образом, он будет загружать его каждый раз, когда вы вызываете его в цикле. Сохранить в списке перед циклом

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

Я измерил его, оставаясь таким же медленным.

blablubla12 29.11.2018 15:33

Какой размер таблицы в db? сколько токенов для обновления или создания отправлено серверами? В соответствии с этим, возможно, весь токен не потребуется загружать в приложение.

LeBigCat 29.11.2018 15:40

270 строк данных и примерно столько же строк, возвращаемых сервером

blablubla12 29.11.2018 15:49

Вы можете использовать профилировщик sql, чтобы показать сгенерированный запрос sql? также насколько медленный "медленный"? простая вставка базы данных на небольшой стол должна быть чертовски быстрой. Выполняется ли это локально, когда база данных находится на том же компьютере, что и код, который выполняется?

GregH 29.11.2018 15:57

Можете ли вы отслеживать свой код (инструментарий), чтобы определить функцию или вызвать медленную? помог бы.

LeBigCat 29.11.2018 16:28

Другие вопросы по теме