Linq查询在没有任何明显原因的情况下被多次触发
我正在尝试优化我的应用程序,我注意到一个查询被多次触发,没有任何明显的原因 是一款MVC3应用程序,razor和我使用的是Linq和EF 我有一个带有几个属性的ViewModel类。 这些属性之一是要查看的模型 这是我的控制器(我省略了所有其他属性初始化):Linq查询在没有任何明显原因的情况下被多次触发,linq,entity-framework,asp.net-mvc-3,Linq,Entity Framework,Asp.net Mvc 3,我正在尝试优化我的应用程序,我注意到一个查询被多次触发,没有任何明显的原因 是一款MVC3应用程序,razor和我使用的是Linq和EF 我有一个带有几个属性的ViewModel类。 这些属性之一是要查看的模型 这是我的控制器(我省略了所有其他属性初始化): public ActionResult companyDetail(Guid id) { companyDetailsViewModel myModel = new companyDetailsViewModel()
public ActionResult companyDetail(Guid id)
{
companyDetailsViewModel myModel = new companyDetailsViewModel();
myModel.companyDetail = companiesRepository.getCompany(id);
return View(myModel);
}
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>
这是我的getCompany方法:
public ActionResult companyDetail(Guid id)
{
companyDetailsViewModel myModel = new companyDetailsViewModel();
myModel.companyDetail = companiesRepository.getCompany(id);
return View(myModel);
}
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>
视图太长,无法粘贴到此处,但它是一个简单视图。
这是一个部件,例如:
public ActionResult companyDetail(Guid id)
{
companyDetailsViewModel myModel = new companyDetailsViewModel();
myModel.companyDetail = companiesRepository.getCompany(id);
return View(myModel);
}
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>
当然,这个动作会再次被调用
你知道怎么预防吗
另一个更新强>
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)”中放置了另一个断点
当我调用视图companyDetail时,第一个停止在base.Execute中,第二个停止在return视图中,但由于某种原因,base.Execute中有第三个停止,return视图中有第四个停止,最后是render视图
这让我发疯了
有人知道为什么是db.companys.Single(c)吗
=>c.id==id)问前2名?像这样:
选择顶部(2)[Extent1].[id]作为[id],
Single()
如果没有一个匹配项,则抛出异常-因此Linq to Entities提供程序将其转换为top 2
查询,该查询的数据足以做出决策-如果查询返回2个结果或无结果,则抛出异常,否则返回唯一的结果。这没有意义。如果查询执行多次,则必须多次调用GetCompany
方法。调用Single
后,将执行查询,并具体化Company
实例,因此在视图中多次使用该实例不会导致新的执行。这些其他调用必须由代码的不同部分引起
顺便说一句,您可以使用Find
(在EF4.1中)或GetObjectByKey
(在EFv1和EFv4中)而不是Single
来避免它们Single
始终在数据库中执行查询,而Find
首先检查是否已加载具有相同实体键的实体,并返回实例而不执行db query:
这是DbContext API(EF 4.1)的代码:
ObjectContext API的代码有点复杂,因为首先必须构建需要实体集名称的
EntityKey
。我描述了使用不同键类型和名称的完整示例。您是否尝试过在调试器中一步一步地运行并查看查询的执行位置?请检查您的操作方法在浏览器获取周期中仅被调用一次。错误的HTML可能会导致操作方法的重复执行。我以前见过格式不正确的图像标记导致类似问题。为什么要调用base execute?谢谢!我不知道我怎么会错过这个!