2011-02-08 20 views
7

在网站上,如果我有一个类:已编译的查询在应用程序的生命周期中需要重新编译多少次?

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

多少次的查询将被编译?每次页面加载...?一旦进入应用程序...?

+0

@Martinho Fernandes:这只是问题的一半......你(错误地)假设OP不知道静态字段在ASP.NET中是如何工作的。 – leppie 2011-02-08 12:12:20

+0

看来你已经在[你的最后一个问题]的答案中得到了这个问题的答案(http://stackoverflow.com/questions/4932594/when-should-i-use-a-compiledquery)。你想在这里有什么不同的问题? – 2011-02-08 12:19:33

回答

1

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

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

4

因为它是一个静态成员,所以一旦在应用程序域中加载了类。

1

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

-1

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

“首次被访问的静态成员之前静态成员初始化,并且静态构造之前,如果任何被称为”。

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

但是,这是否编译?看起来你正试图从一个实例化的类中加载一个静态成员。

1

如果以这种方式定义您的AllTags查询,它将仅被编译一次。 Julie Lerman在Web应用程序和Web服务中检查此blog post的编译查询。