Linq查询被多次触发,没有任何明显的原因

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查看交易..

  • 当我调用视图时,查询它被调用3次.
  • 生成的SQL在所有3上完全相同.
  • 交易ID不同,持续时间也有所不同.
  • 其余几乎是一样的.

有什么想法可以使这个查询多次运行?

另一个问题!

任何人都知道为什么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中有第四个停止,最后视图是渲染.

这让我疯了!

Bro*_*ass 6

任何人都知道为什么db.companies.Single(c => c.id == id)要求排名前2?像这样:

SELECT TOP(2)[Extent1].[id] AS [id],....

Single()如果没有一个匹配项则抛出异常 - 因此Linq to Entities提供程序将其转换top 2为足以作出决策的查询 - 如果查询返回2个结果或者没有结果则抛出异常,否则返回唯一的结果.