EF Core: предотвращение отдельных запросов при обновлении данных - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть данные в двух таблицах в базе данных SQL. У меня EF Core 2.0 сидит сверху. У меня есть метод, который принимает результаты листа Google, и будет сравнивать со значениями в базе данных. Прямо сейчас я вижу, что в моем цикле for выполняется отдельный запрос на выборку для каждого сравнения. Я попытался сделать .Load () для обеих рассматриваемых таблиц, но это, похоже, не дало эффекта. Как заставить EF Core полагаться на данные в памяти и избежать всех дополнительных обращений к БД?

public async Task UpdateRatingsFromGoogleDoc(IList<IList<object>> values)
        {
            bool dirty = false;
            if (values != null && values.Count > 0)
            {
        //Tried this but hasn't helped
                _myDb.Users.Load();
                _myDb.RatingInfo.Load();

                foreach (var row in values)
                {
                    string lastName = (string)row[0];
                    string firstName = (string)row[1];
                    string ratingRawVal = (string)row[3];
                    int rating = 0;
                    if (ratingRawVal != "Rec")
                        if (!(int.TryParse(ratingRawVal, out rating)))
                            continue;
                    var userQuery = _myDb.Users.Where(u => u.FirstName == firstName && u.LastName == lastName);
                    if (userQuery.Count() == 1)
                    {
                        var userId = userQuery.FirstOrDefault().Id;
                        var member = _myDb.RatingInfo.Where(f => f.UserId == userId).FirstOrDefault();
                        if (member.Rating != rating)
                        {
                            member.Rating = rating;
                            member.RatingIsEstimate = false;
                            member.RatingSetTime = DateTime.Now;
                            dirty = true;
                        }
                    }

                }
                if (dirty)
                    await _myDb.SaveChangesAsync();
            }
        }

Обновление: я также пытался _myDb.Users.Include (u => u.RatingInfos) .Load (); это также не похоже на работу.

1 Ответ

0 голосов
/ 10 сентября 2018

Если вы хотите сократить количество запросов к базе данных и вам не нужны последние изменения в базе данных, вам следует кэшировать данные, использовать временную переменную для кэширования данных и добавить .ToList () в конце вашего запроса, чтобы предотвратить отложенную загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...