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

标签 linq entity-framework asp.net-mvc-3

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

是一个 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/

相关文章:

asp.net-mvc - Visual Studio 2012 中数据库优先 Entity Framework 模型的 MVC4 脚手架

entity-framework - 每个类型的 Entity Framework 表 - 仅从基本类型列中选择

c# - 如何在C# MVC 3的 View 中循环数据库记录

.NET Linq 到 XML : final value overwrites the previous DISTINCT values

c# - Enumerable.Any 方法不受支持

c# - 排序的动态列表是只读的?

c# - 有没有办法在迭代期间编辑字典的值?

entity-framework - Entity Framework - 实体只读属性映射到相关表的列

c# - MVC3 EnumDropdownList 选定值

c# - NullReferenceException 包含 LINQ 表达式 MVC3