public AchievementStateDownloadDto GetAchievementState(String userId, DateTime lastUpdated)
        {
            AchievementStateDownloadDto download = new AchievementStateDownloadDto();
            download.UpdateTimestamp = DateTime.UtcNow;
            List<AchievementStateDto> stateList = new List<AchievementStateDto>(); ;

            using (var session = _sessionManager.GetSession())
            {
                var results = session.Linq<AchievementState>()
                    .Where(state => state.ServerDate > lastUpdated && state.UserId == userId);

                foreach (var state in results)
                {
                    AchievementStateDto dto = new AchievementStateDto();
                    dto.AchievementDefinitionId = state.AchievementDefinitionId;
                    dto.Id = state.Id;
                    dto.IsUnlocked = state.IsUnlocked;
                    dto.ServerDate = state.ServerDate;
                    dto.State = state.State;
                    dto.UserId = state.UserId;
                    dto.Version = state.Version;

                    stateList.Add(dto);
                }
            }

            download.State = stateList.ToArray();

            return download;
        }
        public Boolean UploadAchievementState(String userId, AchievementStateDto[] localAchievements)
        {
            if (localAchievements.Count() == 0)
                return true;

            using (var session = _sessionManager.GetSession())
            {
                using (var tx = session.BeginTransaction())
                {

                    List<String> ids = new List<String>();
                    foreach (var achievementState in localAchievements)
                    {
                        ids.Add(achievementState.Id);
                    }

                    var serverAchievements = session.CreateCriteria<AchievementState>()
                        .Add(Expression.In("Id", ids.ToArray()))
                        .List<AchievementState>();

                    foreach (var achievementState in localAchievements)
                    {
                        if (achievementState.UserId != userId)
                            continue;

                        var sa = serverAchievements.Where(a => a.Id == achievementState.Id).FirstOrDefault();

                        if (sa != null)
                        {
                            if (sa.Version < achievementState.Version)
                            {
                                sa.IsUnlocked = achievementState.IsUnlocked;
                                sa.ServerDate = DateTime.UtcNow;
                                sa.State = achievementState.State;
                                sa.Version = achievementState.Version;
                            }
                        }
                        else
                        {
                            AchievementState newState = new AchievementState()
                            {
                                AchievementDefinitionId = achievementState.AchievementDefinitionId,
                                Id = achievementState.Id,
                                RomMd5 = achievementState.RomMd5,
                                IsUnlocked = achievementState.IsUnlocked,
                                ServerDate = DateTime.UtcNow,
                                State = achievementState.State,
                                UserId = achievementState.UserId,
                                Version = achievementState.Version
                            };

                            session.SaveOrUpdate(newState);
                        }
                    }

                    tx.Commit();
                }
            }

            return true;
        }