From 5aebc77fa84ebf581fd27306d37ab61ed1733322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valdis=20Zob=C4=93la?= Date: Wed, 13 Oct 2021 19:50:21 +0300 Subject: [PATCH] loading faster some queries --- server/Features/SetupStudyPlans.cs | 13 +++---- server/Schema/UniversityClass.cs | 54 ++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/server/Features/SetupStudyPlans.cs b/server/Features/SetupStudyPlans.cs index 2bed5691..b5c55c95 100644 --- a/server/Features/SetupStudyPlans.cs +++ b/server/Features/SetupStudyPlans.cs @@ -33,6 +33,8 @@ public async Task Handle(SetupStudyPlans request, CancellationToken cancel var universityId = membership.UniversityId; var turnNumber = membership.Player.LastTurnNumber; + var turn = await db.Turns.FirstOrDefaultAsync(x => x.PlayerId == membership.PlayerId && x.Number == turnNumber); + var members = await db.UniversityMemberships .Include(x => x.Player) .Where(x => x.UniversityId == universityId) @@ -43,12 +45,9 @@ public async Task Handle(SetupStudyPlans request, CancellationToken cancel var prevPalns = await GetTurnPlans(turnNumber - 1, universityId); var mages = (await db.Units - .Include(x => x.Turn) .Include(x => x.Faction) .Include(x => x.Plan) - .Where(x => x.Turn.Number == turnNumber - && x.Turn.PlayerId == request.PlayerId - && x.Faction != null + .Where(x => x.TurnId == turn.Id && x.FactionId != null && x.Skills.Any(s => s.Code == "FORC" || s.Code == "PATT" || s.Code == "SPIR") ) .ToListAsync()) @@ -79,12 +78,10 @@ public async Task Handle(SetupStudyPlans request, CancellationToken cancel return Unit.Value; } - private async Task> GetTurnPlans(int turnNum, long universityId) { + private async Task> GetTurnPlans(long turnId, long universityId) { return (await db.StudyPlans - .Include(x => x.Turn) .Include(x => x.Unit) - .ThenInclude(x => x.Faction) - .Where(x => x.UniversityId == universityId && x.Turn.Number == turnNum) + .Where(x => x.UniversityId == universityId && x.TurnId == turnId) .ToListAsync()) .ToDictionary(x => x.Unit.Number); } diff --git a/server/Schema/UniversityClass.cs b/server/Schema/UniversityClass.cs index 5423ad1b..3cbc5b5a 100644 --- a/server/Schema/UniversityClass.cs +++ b/server/Schema/UniversityClass.cs @@ -1,5 +1,6 @@ namespace advisor { + using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -29,12 +30,61 @@ public UniversityClass(string id) { public int TurnNumber { get; } public async Task> Students([Service] Database db) { - var students = await db.StudyPlans + var query = db.StudyPlans + .AsNoTracking() .Include(x => x.Turn) .Include(x => x.Unit) .ThenInclude(x => x.Faction) .Where(x => x.UniversityId == universityId && x.Turn.Number == TurnNumber) - .ToListAsync(); + .Select(x => new { + x.Id, + x.Study, + x.Target, + x.Teach, + x.TurnId, + x.UniversityId, + x.UnitId, + UnitNumber = x.Unit.Number, + UnitName = x.Unit.Name, + UnitFactionId = x.Unit.FactionId, + UnitFaction = x.Unit.Faction, + UnitSkills = x.Unit.Skills, + UnitCanStudy = x.Unit.CanStudy, + UnitRegionId = x.Unit.RegionId + }); + + var students = (await query.ToListAsync()) + .Select(x => new DbStudyPlan { + Id = x.Id, + Study = x.Study, + Target = x.Target, + Teach = x.Teach, + TurnId = x.TurnId, + UniversityId = x.UniversityId, + UnitId = x.UnitId, + Unit = new DbUnit { + Id = x.UnitId, + Name = x.UnitName, + Number = x.UnitNumber, + FactionId = x.UnitFactionId, + Faction = x.UnitFaction, + Skills = x.UnitSkills, + CanStudy = x.UnitCanStudy, + RegionId = x.UnitRegionId + } + }) + .ToList(); + + var regions = new Dictionary(); + foreach (var s in students) { + var regId = s.Unit.RegionId; + if (!regions.ContainsKey(regId)) { + var reg = await db.Regions.AsNoTracking().FirstOrDefaultAsync(x => x.Id == regId); + regions.Add(regId, reg); + } + + s.Unit.Region = regions[regId]; + } return students; }