Ejemplo n.º 1
0
        private static void FetchGames(ICollection <int> collectionIds, BggDbContext db, DateTime now, BGGClient client)
        {
            var newGames = collectionIds.Except(db.Games.Select(game => game.Id));
            var oldGames =
                db.Games.Where(
                    game => collectionIds.Contains(game.Id) && SqlFunctions.DateDiff("day", game.LastUpdate, now) > 7)
                .Select(game => game.Id);

            var gamesToFetch = newGames.Concat(oldGames).ToList();

            for (var start = 0; start < gamesToFetch.Count; start += ItemsBatchSize)
            {
                var itemsToFetch = gamesToFetch.Skip(start).Take(ItemsBatchSize).ToList();

                var itemsRequest = new BGGThingsRequest {
                    Id = itemsToFetch, Stats = true
                };
                var items = client.GetThingsAsync(itemsRequest).Result.Data.Items;

                var games =
                    items.Select(
                        item =>
                        new Game
                {
                    Id             = item.Id,
                    LastUpdate     = now,
                    Name           = item.Names.Single(name => name.Type == PrimaryNameType).Value,
                    Rating         = item.AverageRating,
                    BayesRating    = item.BayesAverageRating,
                    Weight         = item.AverageWeight,
                    MinimumPlayers = item.MinimumPlayers,
                    MaximumPlayers = item.MaximumPlayers,
                    PlayingTime    = item.PlayingTime,
                    MinimumAge     = item.MinimumAge
                });

                foreach (var game in games)
                {
                    var oldGame = db.Games.FirstOrDefault(old => old.Id == game.Id);
                    if (oldGame == null)
                    {
                        db.Games.Add(game);
                    }
                    else
                    {
                        db.Entry(oldGame).CurrentValues.SetValues(game);
                    }
                }

                db.SaveChanges();
            }
        }