我正在尝试优化我的应用,我注意到一个查询在没有任何明显原因的情况下被多次触发。
是一个 MVC 3 应用程序,razor,我正在使用 Linq 和 EF。
我有带有几个属性的 ViewModel 类。 这些属性之一是要查看的模型。
这是我的 Controller (我省略了所有其他属性初始化):
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);
}
View 太长,无法粘贴到此处,但这是一个简单的 View 。 这部分例如:
<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 查看交易..
- 当我调用 View 时,查询是 叫了 3 次。
- 生成的 SQL 是 所有 3 个都完全相同。
- 交易ID不同,而且 持续时间略有不同。
- 其余的几乎相同。
知道是什么让这个查询运行多次吗?
另一个问题!
有人知道为什么 db.companies.Single(c => c.id == id) 要求前 2 名吗?像这样:
选择顶部 (2) [Extent1].[id] AS [id], ….
提前致谢!
埃德加。
更新!
第三个电话是我的错,我解决了。 但是,我发现:
应用程序是多语言的,所以我写了一个实现 Controller 的类。
我将问题追溯到这个类。当我调用 Base 时,在类(class)结束时第二次触发查询:
base.Execute(requestContext);
当然, Action 会再次调用。
知道如何防止这种情况吗?
另一个更新!
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);
}
}
我的 Controller 是这样定义的:
public class companiesController : LocalizedControllerBase
我在 “Base.Execute” 中放置了一个断点,在 Controller 的 “return View(myModel)” 中放置了另一个断点。
当我调用 View companyDetail 时,第一站在 base.Execute 中,第二站在返回 View 中,但由于某种原因,第三站在 Base.Execute 中,第四站在 Return View 中,最后是 View 是渲染。
这让我发疯了!
最佳答案
如果不完全匹配,Anyone know why db.companies.Single(c => c.id == id) ask for top 2? Like this:
SELECT TOP (2) [Extent1].[id] AS [id], ….
Single()
将抛出异常 - 因此 Linq to Entities 提供程序将其转换为 top 2
查询,这是足够的数据来进行一个决定 - 如果查询返回 2 个结果或没有结果,则抛出异常,否则返回唯一的结果。
关于Linq 查询在没有任何明显原因的情况下被多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507965/