Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq查询在没有任何明显原因的情况下被多次触发_Linq_Entity Framework_Asp.net Mvc 3 - Fatal编程技术网

Linq查询在没有任何明显原因的情况下被多次触发

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()

我正在尝试优化我的应用程序,我注意到一个查询被多次触发,没有任何明显的原因

是一款MVC3应用程序,razor和我使用的是Linq和EF

我有一个带有几个属性的ViewModel类。 这些属性之一是要查看的模型

这是我的控制器(我省略了所有其他属性初始化):

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?谢谢!我不知道我怎么会错过这个!