public static void Main()
        {
            var context = new DiabloEntities();
            var charactersNames = context.Characters
                .Select(c => c.Name);

            foreach (var charactersName in charactersNames)
            {
                Console.WriteLine(charactersName);
            }
        }
        public static void Main()
        {
            var context = new DiabloEntities();
            var charactersWithPlayers = context.Characters
                .OrderBy(c => c.Name)
                .Select(c => new
                {
                    name = c.Name,
                    playedBy = c.UsersGames
                        .Select(ug => ug.User.Username)
                });

            string json = JsonConvert.SerializeObject(charactersWithPlayers, Formatting.Indented);
            File.WriteAllText("../../characters.json", json);
        }
        private static bool CheckIfAllGamesExists(IEnumerable<XElement> games, DiabloEntities context)
        {
            foreach (var game in games)
            {
                string gameName = game.Element("game-name").Value;
                var gameInDatabase = context.Games
                    .FirstOrDefault(g => g.Name == gameName);

                if (gameInDatabase == null)
                {
                    return false;
                }
            }

            return true;
        }
        public static void Main()
        {
            var context = new DiabloEntities();
            var finishedGamesWithPlayers = context.Games
                .Where(g => g.IsFinished)
                .OrderBy(g => g.Name)
                .ThenBy(g => g.Duration)
                .Select(g => new
                {
                    g.Name,
                    g.Duration,
                    Users = g.UsersGames
                        .Select(ug => new
                        {
                            ug.User.Username,
                            ug.User.IpAddress
                        })
                });

            XElement rootElement = new XElement("games");
            foreach (var game in finishedGamesWithPlayers)
            {
                XElement xGame = new XElement(
                    "game",
                    new XAttribute("name", game.Name));
                if (game.Duration != null)
                {
                    xGame.SetAttributeValue("duration", game.Duration);
                }

                XElement xUsers = new XElement("users");
                foreach (var user in game.Users)
                {
                    XElement xUser = new XElement(
                        "user",
                        new XAttribute("username", user.Username),
                        new XAttribute("ip-address", user.IpAddress));

                    xUsers.Add(xUser);
                }

                xGame.Add(xUsers);
                rootElement.Add(xGame);
            }

            rootElement.Save("../../finished-games.xml");
        }
        public static void Main()
        {
            var context = new DiabloEntities();
            XDocument doc = XDocument.Load("../../users-and-games.xml");
            var xmlUsers = doc.XPathSelectElements("users/user");

            foreach (var xmlUser in xmlUsers)
            {
                var games = xmlUser.XPathSelectElements("games/game");
                bool allGamesExistsInDatabases = CheckIfAllGamesExists(games, context);

                if (allGamesExistsInDatabases)
                {
                    User userInDatabase = CreateUserIfNotExists(xmlUser, context);
                    AddUserToGames(games, userInDatabase, context);
                }
            }
        }
        private static void AddUserToGames(IEnumerable<XElement> games, User userInDatabase, DiabloEntities context)
        {
            foreach (var game in games)
            {
                string gameName = game.Element("game-name").Value;
                string characterName = game.Element("character").Attribute("name").Value;
                int characterId = context.Characters
                    .FirstOrDefault(ch => ch.Name == characterName).Id;
                decimal characterCash = decimal.Parse(game.Element("character").Attribute("cash").Value);
                int characterLevel = int.Parse(game.Element("character").Attribute("level").Value);
                DateTime joinedOn = DateTime.Parse(game.Element("joined-on").Value);

                int gameId = context.Games
                    .FirstOrDefault(g => g.Name == gameName).Id;
                var usersGameInDatabase = context.UsersGames
                    .FirstOrDefault(ug => ug.GameId == gameId && ug.UserId == userInDatabase.Id);

                if (usersGameInDatabase == null)
                {
                    UsersGame newUsersGame = new UsersGame()
                    {
                        GameId = gameId,
                        UserId = userInDatabase.Id,
                        CharacterId = characterId,
                        Level = characterLevel,
                        JoinedOn = joinedOn,
                        Cash = characterCash
                    };

                    context.UsersGames.Add(newUsersGame);
                    Console.WriteLine("User {0} successfully added to game {1}", userInDatabase.Username, gameName);
                }
            }

            context.SaveChanges();
        }
        private static User CreateUserIfNotExists(XElement xmlUser, DiabloEntities context)
        {
            string username = xmlUser.Attribute("username").Value;
            var userInDatabase = context.Users.FirstOrDefault(u => u.Username == username);

            if (userInDatabase != null)
            {
                Console.WriteLine("User {0} already exists", username);
                return userInDatabase;
            }

            int isDeletedValue = int.Parse(xmlUser.Attribute("is-deleted").Value);
            bool isDeleted = isDeletedValue != 0;
            string ipAddress = xmlUser.Attribute("ip-address").Value;
            DateTime registrationDate = DateTime.Parse(xmlUser.Attribute("registration-date").Value);
            string firstName =
                xmlUser.Attribute("first-name") != null ? xmlUser.Attribute("first-name").Value : null;
            string lastName =
                xmlUser.Attribute("last-name") != null ? xmlUser.Attribute("last-name").Value : null;
            string email =
                xmlUser.Attribute("email") != null ? xmlUser.Attribute("email").Value : null;

            User newUser = new User()
            {
                Username = username,
                FirstName = firstName,
                LastName = lastName,
                Email = email,
                RegistrationDate = registrationDate,
                IsDeleted = isDeleted,
                IpAddress = ipAddress
            };

            context.Users.Add(newUser);
            context.SaveChanges();
            Console.WriteLine("Successfully added user {0}", username);

            return newUser;
        }