public async Task GetScoreBoardInfo(Request request, Response response) { var groupDb = DbFactory.Get <UserGroup>(); var groupList = await groupDb.SelectAllFromCache(); var progressDb = DbFactory.Get <Progress>(); var progressList = await progressDb.SimpleDb.AsQueryable().ToListAsync(); var progressDict = progressList.ToDictionary(it => it.gid, it => it); var scoreBoardList = groupList.Select(it => { var r = new ScoreBoardItem { gid = it.gid, group_name = it.groupname, group_profile = it.profile }; if (progressDict.ContainsKey(it.gid)) { var progress = progressDict[it.gid]; r.is_finish = progress.is_finish; if (r.is_finish == 1) { r.total_time = (progress.finish_time - Ccxc.Core.Utils.UnixTimestamp.FromTimestamp(Config.Config.Options.StartTime)).TotalHours + progress.penalty; } r.score = progress.score; r.finished_puzzle_count = progress.data.FinishedPuzzles.Count; } return(r); }).ToList(); var res = new ScoreBoardResponse { status = 1, finished_groups = scoreBoardList.Where(it => it.is_finish == 1).OrderBy(it => it.total_time).ThenBy(it => it.finished_puzzle_count).ToList(), groups = scoreBoardList.Where(it => it.is_finish != 1).OrderByDescending(it => it.score).ThenBy(it => it.gid).ToList() }; await response.JsonResponse(200, res); }