Я пытаюсь оптимизировать свое приложение и замечаю, что один запрос запускается несколько раз без видимой причины.
Является ли приложение MVC 3 бритвой, и я использую Linq и EF.
У меня есть класс ViewModel с несколькими свойствами.Одним из этих свойств является модель для просмотра.
Это мой контроллер (я пропускаю все остальные свойства инициализации):
public ActionResult companyDetail(Guid id)
{
companyDetailsViewModel myModel = new companyDetailsViewModel();
myModel.companyDetail = companiesRepository.getCompany(id);
return View(myModel);
}
Этомой метод getCompany:
public company getCompany(Guid id)
{
return db.companies.Single(c => c.id == id);
}
Представление слишком длинное для вставки, но это простое представление.Это часть, например:
<div id="companyName">
<h2>
@Model.companyDetail.companyName
</h2>
</div>
<div id="companyInfoWapper">
<div class="companyInfo">
<h5>
industry: @Model.companyDetail.industry<br />
revenue: @String.Format("{0:C}", Model.companyDetail.revenue)
</h5>
</div>
</div>
Я использую AnjLab SQL Profiler для просмотра транзакций ..
- Когда я вызываю представление, запрос этозвонил 3 раза.
- Сгенерированный SQL одинаков для всех 3.
- Идентификатор транзакции отличается, а также продолжительность немного меняется.
- Остальные в значительной степени одинаковы.
Есть идеи, что может заставить этот запрос выполняться несколько раз?
Другой вопрос!
Кто-нибудь знает, почему db.companies.Single (c => c.id == id) запрашивает топ-2?Например:
ВЫБРАТЬ ТОП (2) [Экстент1]. [Id] AS [id],….
Заранее спасибо!
Эдгар.
Обновление!
Третий звонок был моей ошибкой, и я исправляю ее. Однако , я нахожу это:
Приложение многоязычное, поэтому я пишу класс, который реализует Controller.
Я прослеживаю проблему для этого класса.Запрос запускается второй раз в конце класса, когда я вызываю Base:
base.Execute(requestContext);
и, конечно, действие вызывается снова.
Любая идея, как это предотвратить?
Еще одно обновление!
Linkgoron спрашивает, почему я вызываю Base.Execute (), ответ из-за реализации localizedController.
Но его вопрос заставляет меня задуматься, и есть другая часть кода:
public abstract class LocalizedControllerBase : Controller
{
public String LanguageCode { get; private set; }
private String defaultLanguage = "es";
private String supportedLanguages = "en|es|pt";
protected override void Execute(RequestContext requestContext)
{
if (requestContext.RouteData.Values["languageCode"] != null)
{
LanguageCode = requestContext.RouteData.Values["languageCode"].ToString().ToLower();
if (!supportedLanguages.ToLower().Contains(LanguageCode))
{
LanguageCode = defaultLanguage;
}
}
else {
LanguageCode = defaultLanguage;
}
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture(LanguageCode);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
base.Execute(requestContext);
}
}
Мой контроллер определен так:
public class companiesController : LocalizedControllerBase
Я поставилточка останова в «Base.Execute» и другая в «return View (myModel)» в контроллере.
Когда я вызываю view companyDetail, первыйstop находится в base.Execute, второй находится в обратном представлении, но по какой-то причине в Base.Execute есть третий и четвертый в возвращаемом представлении, и, наконец, представление отображается.
Это делаетя сумасшедший!