在应用程序的生命周期中,编译查询需要重新编译多少次?

7

In a website, if I have a class:

public class Provider
{
    static readonly Func<Entities, IEnumerable<Tag>> AllTags =
        CompiledQuery.Compile<Entities, IEnumerable<Tag>>
        (
            e => e.Tags
        );

    public IEnumerable<Tag> GetAll()
    {
        using (var db = new Entities())
        {
            return AllTags(db).ToList();
        }
    }
}

在一个页面中,我有以下内容:

protected void Page_Load(object sender, EventArgs ev)
{
    (new Provider()).GetAll();
}

每次页面加载时,查询将被编译多少次?在应用程序中只编译一次吗?

@Martinho Fernandes:这只是问题的一半...你(错误地)假设OP不知道ASP.NET中静态字段的工作原理。 - leppie
看起来你已经在 你上一个问题 的答案中得到了这个问题的答案。你在这里想要不同地问什么? - Cody Gray
@Cody Gray,编辑得很好!谢谢你! :) - BrunoLM
@Cody,我认为那个问题在那里没有表述得很清楚,所以我决定详细说明一下。这里关于这个问题的答案更加专注... - BrunoLM
5个回答

4

由于它是静态成员,所以只有在应用程序域加载类时才会加载。


1

看到它已经编译过了。我会说一次就够了。为什么需要重新编译呢?这不是编译查询的目的吗?

由于编译查询是静态的,所以只需在应用程序实例/生命周期内进行一次。注意:生命周期可能重叠。


1
我认为应该是每个应用程序域一次,因为它是一个静态变量。

1
如果您按照这种方式定义AllTags查询,它将只被编译一次。请参考Julie Lerman的博客文章,了解Web应用程序和Web服务中编译查询的相关信息。

-1

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx#Y696

“静态成员在第一次访问之前初始化,并在调用任何静态构造函数之前进行初始化。”
“因此,每次加载页面时最多编译一次。由于您的类没有静态构造函数,因此在实际访问静态成员之前不应该编译。(根据MSDN的说法。)”
“但是,这是否编译?看起来您正在尝试从已实例化的类中加载静态成员。”

我并没有说这是强制性的。我说他没有一个。根据文档,这意味着它不会设置静态字段,直到它们被使用。 - William

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接