2011-02-08 17 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

+0

[あなたの最後の質問](http://stackoverflow.com/questions/4932594/when-should-i-use-a-compiledquery)の回答で、この質問に対する回答が既に得られているようです。何をここで別に尋ねようとしていますか? –

+0

@Cody Grey、nice edit!ありがとうございました! :) – BrunoLM

答えて

1

これがコンパイルされています。私は一度言うだろう。なぜそれを再コンパイルする必要がありますか?それはコンパイルされたクエリのポイントではありませんか?

コンパイルされたクエリは静的であり、アプリケーションインスタンス/ライフタイムごとに1回です。注:生涯は重複する可能性があります。

4

これは静的メンバーであるため、クラスがアプリドメインに読み込まれると1度です。

1

静的変数なので、AppDomainごとに1回言うと思います。

-1

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

「静的メンバは、静的メンバが最初にアクセスされる前に初期化され、静的コンストラクタの前に、いずれかが呼び出された場合。」

したがって、ページが読み込まれるたびにコンパイルされます。あなたのクラスは静的なコンストラクタを持っていないので、静的なメンバに実際にアクセスするまでコンパイルしてはいけません。 (MSDNによると)

ただし、コンパイルできますか?インスタンス化されたクラスから静的メンバーをロードしようとしているようです。

+0

静的コンストラクタは必須ではありません。他のポイントは有効です –

+0

私はそれが必須であるとは言いませんでした。私は彼が持っていないと言いました。そしてドキュメントによると、それはそれらが使用されるまで静的フィールドを設定しないということです。 – William

1

この方法でAllTagsクエリを定義すると、1回だけコンパイルされます。 Julie LermanによるWebアプリケーションとWebサービスのコンパイルされたクエリについてはblog postをチェックしてください。

関連する問題