2011-02-08 19 views
7

In un sito web, se ho una classe:Quante volte una query compilata deve ricompilare durante il ciclo di vita di un'applicazione?

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

In una pagina che ho:

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

Quante volte l'interrogazione verrà compilata? Ogni volta che la pagina viene caricata ...? Una volta nell'applicazione ...?

+0

@ Martin Fernandes: Questa è solo la metà della domanda ... Si sta (erroneamente) assumendo che l'OP non sia a conoscenza di come funzionano i campi statici in ASP.NET. – leppie

+0

Sembra che tu stia già ricevendo la risposta a questa domanda nelle risposte a [la tua ultima domanda] (http://stackoverflow.com/questions/4932594/when-should-i-use-a-compiledquery). Cosa stai cercando di chiedere in modo diverso qui? –

+0

@Cody Grigio, bella modifica! Grazie! :) – BrunoLM

risposta

1

Vedere è compilato. Direi una volta Perché dovrebbe essere ricompilato? Non è questo il punto delle query compilate?

Dato che la query compilata è statica, una volta per istanza/durata dell'applicazione. Nota: le vite possono sovrapporsi.

4

poiché è un membro statico, una volta quando la classe viene caricata nel dominio dell'app.

1

Direi una volta per AppDomain, poiché è una variabile statica.

-1

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

"membri statici vengono inizializzati prima che il membro statico si accede per la prima volta, e prima che il costruttore statico, se del caso si chiama".

Quindi compila al massimo ogni volta che viene caricata la pagina. Poiché la classe non ha un costruttore statico, non dovrebbe compilare finché non si accede effettivamente al membro statico. (Secondo MSDN.)

Tuttavia, viene compilato? Sembra che tu stia cercando di caricare un membro statico da una classe istanziata.

+0

Il costruttore statico non è obbligatorio. l'altro punto è valido –

+0

Non ho detto che era obbligatorio. Ho detto che non ne aveva uno. E secondo la documentazione, ciò significa che non imposta i campi statici finché non vengono utilizzati. – William

1

Se si definisce la query AllTags in questo modo verrà compilata una sola volta. Controlla questo blog post sulle query compilate in applicazioni Web e servizi Web di Julie Lerman.