2013-03-04 4 views
3

У нас есть веб-приложение MVC 4. Я использовал miniprofiler, чтобы проверить, сколько времени он принимает, и показывает, что визуализация представления с тремя частичными представлениями занимает очень много времени. Я попытался переместить информацию в частичном представлении прямо на страницу, и это не повлияло на время вообще. Что делать, чтобы уменьшить время рендеринга? Любые советы о том, где я должен начать искать? Как вы можете видеть, рендер занимает 48 секунд.Rendering View занимает очень много времени

          **| duration | from start(ms)** 
|http://localhost:61380/CaseContacts  | 653.7 | +0.0 
|Controller: CaseController.Contacts  | 11.9  | +641.1 
| Contacts view - not an ajax request | 0.3  | +651.7 
|  populating view model   | 0.0  | +652.1 
| getting list of contacts   | 374.4 | +652.1 
| Find: Contacts      | 499.8 | +1033.6 
| Render: Contacts     | 48400.8 | +1535.2 

**| client event   |duration(ms)| from start(ms)** 
|Request start   |   | +2.0 
|Response    | 1.0  | +52245.0 
|Dom loading    |   | +52247.0 
|scripts     | 390.0  | +52315.0 
|Dom Content Loaded Event| 29.0  | +52707.0 
|Dom Interactive   |   | + 52707.0 
|Load Event    |   | + 52760.0 
|Dom Complete   |   | + 52760.0 

Обновление:

public IQueryable<T> FindQueryable(Expression<Func<T, bool>> predicate, Func<T, Object> orderBy) 
    { 
     return this.db.GetAll<T>().Where(predicate).OrderBy(orderBy).AsQueryable<T>(); 
    } 
public class ContactRepository : Repository<USRContact>, IContactRepository<USRContact> 
{ 
    public IList<ContactNameViewModel> GetAll(int fieldOfficeID, string searchText = "") 
    { 
     if (searchText.Length > 0) 
      return Mapper.Map<IList<USRContact>, IList<ContactNameViewModel>>(this.FindQueryable(x => (x.FieldOfficeID == fieldOfficeID) && 
      (x.FormalName.Contains(searchText) || x.PreferredName.Contains(searchText) || x.Alias.Contains(searchText) || x.Pseudonym.Contains(searchText)), x => (x.STMGender.Gender)).ToList()); 
     else 
      return Mapper.Map<IList<USRContact>, IList<ContactNameViewModel>>(this.FindQueryable(x => (x.FieldOfficeID == fieldOfficeID)).ToList()); 
    } 

Затем мой контроллер загружает результаты на ViewModel, а затем:

@Html.Partial("~/Views/Shared/Contacts/ContactNameList.cshtml", Model.Contacts) 

Частичный вид содержит следующий код:

@model IList<Casenator.Web.Models.Contact.ContactNameViewModel> 
<ul id="NameList" style="margin-left:0"> 
    @foreach (var item in Model) 
    { 
     @*<li>@Html.RouteLink(@item.FullName, "Contacts", new { id = item.ContactID })</li>*@ 
     <li>@Ajax.RouteLink(item.FullName, "Contacts", new { id = item.ContactID }, new AjaxOptions { UpdateTargetId = "BasicInfo", OnSuccess="InitializeComboBoxes", OnBegin="LoadContact(" + item.ContactID + ")" }) </li> 
    } 
</ul> 

Любая помощь будет оценена! Thanks, Safris

+0

просто дикая идея, что происходит, если вы делаете переписку с результатом запроса, улучшает ли она какую-либо производительность. – Tassadaque

+0

. Результат моего запроса на самом деле возвращается в виде списка. – safriss

ответ

1

Что вы возвращаете из запроса, важно. Если вы возвращаетесь IEnumerable Было бы лучше возобновить IQueryable. Вы можете видеть this вопрос, который может вам помочь в вашей ситуации

Не думаю, что automapper, как и инструменты, предназначены для отображения многих повторений. вы можете попытаться нанести на карту объект вручную

+0

Чтобы найти список контактов, он занимает 374,4 мс. Похоже, что рендер занимает больше времени (48400,8 мс). Я использую automapper для перевода из модели домена для просмотра модели. Поэтому я не могу перевести с IQueryable на IQueryable . – safriss

+0

Тогда вы можете попытаться отобразить его в mannually или увидеть, если automapper i scausing issue – Tassadaque

+0

Общий репозиторий может быть непригоден в какой-то ситуации – Tassadaque