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

时间:2011-02-08 12:02:40

标签: c# asp.net lifecycle compiled-query

在网站上,如果我有课程:

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

查询将被编译多少次?每次页面加载......?一旦进入申请表......?

5 个答案:

答案 0 :(得分:4)

因为它是一个静态成员,一旦在app域中加载了类。

答案 1 :(得分:1)

看到它被编译。我会说一次。为什么需要重新编译?这不是编译查询的重点吗?

鉴于编译的查询是静态的,每个应用程序实例/生命周期一次。注意:生命周期可能会重叠。

答案 2 :(得分:1)

我会说每个AppDomain一次,因为它是一个静态变量。

答案 3 :(得分:1)

如果以这种方式定义AllTags查询,它将只编译一次。请查看此blog post有关Julie Lerman在Web应用程序和Web服务中编译的查询的信息。

答案 4 :(得分:-1)

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

“静态成员在第一次访问静态成员之前被初始化,并且在静态构造函数之前,如果有的话被调用。”

因此每次加载页面时最多都会编译。由于您的类没有静态构造函数,因此在您实际访问静态成员之前不应编译它。 (根据MSDN。)

但是,这会编译吗?您似乎正在尝试从实例化的类中加载静态成员。