EF Core:更新数据时防止单个查询

时间:2018-09-09 19:32:52

标签: entity-framework entity-framework-core

我在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 :(得分:0)

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