代码之家  ›  专栏  ›  技术社区  ›  BenjiFB

ef core:更新数据时阻止单个查询

  •  0
  • BenjiFB  · 技术社区  · 6 年前

    我在一个SQL数据库的两个表中得到了数据。我把EF核心2.0放在最上面。我有一个方法可以获取谷歌工作表的结果,并将其与数据库中的值进行比较。现在我可以看到,在for循环中,它为每个比较执行一个单独的select查询。我尝试对两个有问题的表都执行.load(),但似乎没有效果。如何让ef核心依赖内存中的数据并避免所有额外的db命中?

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

    更新:我还尝试过'u mydb.users.include(u=>u.ratingfos).load(); 这似乎也不管用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mojtaba Tajik    6 年前

    如果要减少数据库查询,并且不需要对数据库进行最新更改,则应缓存数据,使用临时变量缓存数据,并在查询结束时添加.tolist(),以防止延迟加载。