Как оптимизировать загрузку 10 строк в datatable?
Я работаю над обработкой данных на стороне сервера, которая получает около 1000 поддельных / общих пользовательских данных из базы данных и загружает 10 строк на страницу. То, как я написал свой код прямо сейчас, занимает не менее 2 минут, чтобы просто показать первые 10 строк.
Я отладил его, чтобы найти причину, по которой он занимает так много времени, потому что я получаю роли для каждого пользователя и показываю их на datatable. Когда я комментирую часть получения ролей и использую пустую строку и список, datatable загружается быстро. Но я должен получить роли, и мне трудно понять, как это сделать. Может ли кто-нибудь помочь мне в этом вопросе? Я боролся с SQL-частью в течение самого долгого времени и до сих пор не добился успеха.
Что я уже пробовал:
private async Task<IEnumerable<UserViewModel>> GetUserData(ApplicationDbContext db) { var users = db.Users; var list = await GetUsers(db, users); var vmlist = list.Select(item => new UserViewModel() { ID = item.ID, Username = item.Username, FirstName = item.FirstName, LastName = item.LastName, Email = item.Email, TaxID = item.TaxID, TaxIdHash = item.TaxIdHash, IV = item.IV, TaxIDEncrypted = item.TaxIDEncrypted, //RoleList = new List<string>(), //Roles = "", // This is the part giving me issues RoleList = RoleRepository.GetRolesByUserId(UserManager, item.ID, false), Roles = string.Join(",", RoleRepository.GetRolesByUserId(UserManager, item.ID, false).ToArray()), }); return vmlist; }
Я вызываю метод GetUserData в этом методе UserGrid.
public async Task<ActionResult> UserGrid(DataTablesViewModel param) { using (var db = new Infrastructure.Data.ApplicationDbContext()) { db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); var data = await GetUserData(db); IQueryable<UserViewModel> filteredUsers = data.AsQueryable(); List<UserViewModel> displayedTasks = filteredUsers.Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList(); int count = filteredUsers.Count(); foreach (var item in displayedTasks){ if (!String.IsNullOrEmpty(item.TaxID) && item.IV != null && item.TaxIDEncrypted != null) { if (item.RoleList.Any(x => x == UserRoles.Applicant)) { string ssndecrypt = GenericHelper.DecryptPortalTaxID(item.IV, item.TaxIDEncrypted); string ssn = (ssndecrypt.Length == 11 ? ssndecrypt.Substring(7, 4) : ssndecrypt); item.TaxID = (ssndecrypt.Length == 11 ? String.Join("", item.TaxID.Substring(0, 7), ssn) : ssn);} } else { item.TaxID = String.Empty; } item.Delete = item.RoleList.Intersect(UserRoles.CanDelete).Count() > 0 ? "<a class=\"delete\" data-url=\"" + Url.Action("DeleteUser", "Users") + "\" data-userid=\"" + item.ID + "\"data-username=\"" + item.Username + "\" href=\"#\">Delete User</a>" : String.Empty; } var result = GridHelper.GetData(displayedTasks); var json = Json(new { sEcho = param.sEcho, iTotalRecords = count, iTotalDisplayRecords = count, aaData = result }, JsonRequestBehavior.AllowGet); return await Task.FromResult(json); }
Мне понадобится список ролей, потому что я использую его позже для расшифровки зашифрованного SSN и отображения его последних 4 номеров.
Это UserViewModel, если это необходимо.
public UserViewModel(IList<string> roles, ApplicationUser user) { ID = user.Id; Username = user.UserName; Email = user.Email; RoleList = roles.ToList(); ; Roles = string.Join(",", RoleList.ToArray()); IsActive = user.IsActive; AllowRoleChanges = !RoleList.Intersect(UserRoles.FinalConsumers).Any(); AssignableRoles = HousingServices.Core.Models.UserRoles.CanCreate.Select(x => new SelectListItem { Text = x, Value = x }).ToList(); if (RoleList.Contains(UserRoles.Caseworker)) { AssignableRoles.Add(new SelectListItem { Value = UserRoles.Caseworker, Text = UserRoles.Caseworker }); } RoleIDs = RoleList.Select(x => x).ToList(); .......... } }
private async Task<IEnumerable<dynamic>> GetUsers(ApplicationDbContext db, IDbSet<ApplicationUser> users) { IQueryable<ApplicationUser> userlist = users; <pre>var hsuserlist = userlist.Join(db.EliteHousingServicesUsers, u => u.Id, hu => hu.UserId, (u, hu) => new { ID = u.Id, Username = u.UserName, FirstName = hu.FirstName, LastName = hu.LastName, Email = u.Email, TaxID = "XXX-XX-XXXX", Active = (u.IsActive ? "Yes" : "No"), TaxIdHash = hu.TaxIDHash, IV = hu.IV, TaxIDEncrypted = hu.TaxIDEncrypted, IsActive = u.IsActive, Status = (u.AccessFailedCount >= MaxFailedAccessAttemptsBeforeLockout ? "<a class=\"unlock\" data-url=\"" + unlockUrl + "\" data-userid=\"" + u.Id + "\"data-username=\"" + u.UserName + "\" href=\"#\">Unlock</a>" : "<a class=\"reset\" data-url=\"" + resetUrl + "\" data-userid=\"" + u.Id + "\"data-username=\"" + u.UserName + "\" href=\"#\">Reset Password</a>"), });