epa*_*ulk 2 linq entity-framework asp.net-mvc-3
我正在尝试优化我的应用程序,并且我注意到一个查询被多次触发而没有任何明显的原因.
是一个MVC 3应用程序,剃刀和我正在使用Linq和EF.
我有一些带有几个属性的ViewModel类.其中一个属性是要查看的模型.
这是我的控制器(我省略了所有其他属性的初始化):
public ActionResult companyDetail(Guid id)
{
companyDetailsViewModel myModel = new companyDetailsViewModel();
myModel.companyDetail = companiesRepository.getCompany(id);
return View(myModel);
}
Run Code Online (Sandbox Code Playgroud)
这是我的getCompany方法:
public company getCompany(Guid id)
{
return db.companies.Single(c => c.id == id);
}
Run Code Online (Sandbox Code Playgroud)
视图太长而无法在此处粘贴,但这是一个简单的视图.这是一个例子:
<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>
Run Code Online (Sandbox Code Playgroud)
我正在使用AnjLab SQL Profiler查看交易..
有什么想法可以使这个查询多次运行?
另一个问题!
任何人都知道为什么db.companies.Single(c => c.id == id)要求排名前2?像这样:
SELECT TOP(2)[Extent1].[id] AS [id],....
提前致谢!
埃德加.
更新!
第三个电话是我的错,我解决了.但是,我发现这个:
该应用程序是多语言的,所以我编写了一个实现Controller的类.
我将问题追溯到这个班级.当我调用Base时,在类结束时第二次触发查询:
base.Execute(requestContext);
Run Code Online (Sandbox Code Playgroud)
当然,这个动作再次被召唤.
任何想法如何防止这种情况?
另一个更新!
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器定义如下:
public class companiesController : LocalizedControllerBase
Run Code Online (Sandbox Code Playgroud)
我在"Base.Execute"中设置了一个断点,在控制器的"返回视图(myModel)"中放了另一个断点.
当我调用视图companyDetail时,第一个是在base.Execute中,第二个是在返回视图中,但由于某种原因,在Base.Execute中有第三个停止,在Return View中有第四个停止,最后视图是渲染.
这让我疯了!
任何人都知道为什么db.companies.Single(c => c.id == id)要求排名前2?像这样:
SELECT TOP(2)[Extent1].[id] AS [id],....
Single()如果没有一个匹配项则抛出异常 - 因此Linq to Entities提供程序将其转换top 2为足以作出决策的查询 - 如果查询返回2个结果或者没有结果则抛出异常,否则返回唯一的结果.