SQL Compact - SKIP, TAKE and SQL emitted code

Per ottenere la lettura della n-esima riga di una tabella filtrata mediante Skip() e Take() basta eseguire una istruzione del tipo:
// Troviamo la row id della riga (randomSkip +1)-esima
int wordPK = (from w in dbContext.Words
              where w.Language == languageDictionaryCountryCode
              select w.Word_PK).Skip(n-1).Take(1).Single();

// Recuperiamo il testo della parola
string wordText = (from w in dbContext.Words
                   where w.Word_PK == wordPK
                   select w.Text).First();

e fin qui nulla di nuovo.

La cosa invece si fa interessante se andiamo a verificare il codice SQL emesso da LinqTo SQL per le diverse versioni di SQL Compact:

Se usiamo la versione 3.5 (o anche la 4.0, non fa differenza)  su un’applicazione non Windows Phone, otteniamo (grazie a LinqPad):

image

Com’è possibile notare, il codice SQL non fa uso di SKIP and TAKE, perché SQL Command non li supporta (vedi la documentazione Microsoft).

Ma questo non è del tutto vero, perche nel caso del SqlProvider utilizzato nei progetti Windows Phone 7.5 (Mango edition, tanto per intenderci), qualcosa è cambiato, anche se non ho trovato alcuna documentazione in merito.

Infatti, grazie alla possibilità di impostare la proprietà Log del DataContext ad una classe di tipo TextWriter, sono riuscito a recuperare il codice SQL emesso dal SqlProvider:

image

E’ evidente che lo SqlProvider è nuovo (versione 7.0.0.0) e che il motore di SQL Compact 3.5 WP7 Edition è in grado di gestire lo SKIP and TAKE nativamente (anche se le chiama OFFSET e NEXT).

Da tutto ciò si ricava la conferma che SQL Compact per Windows Phone ha un motore tutto nuovo, pur usando il formato dati versione 3.5, con alcune feature introdotte nella versione 4.0 .

That’s all folks!

UPDATE

Ho modificato il post per riflettere le ulterioni informazioni ricevute da Erik relativamente alla versione 4.0 che a differenza della 3.5 consente l’uso di OFFSET and FETCH.

Nota che nel commento di Erik il link non funziona ma l’url è giusto: http://msdn.microsoft.com/en-us/library/ms173288(v=SQL.110).aspx

UPDATE 29/01/2012

Il sorgente (in C#) del DebugTextwriter che Erik ha inserito nella versione 2.6.1 del suo utilissimo SQL CE Toolbox lo potete trovare nel mio post Visualizzare il comando SQL emesso da LinqToSQL.

Fare il debug del “Page State” di una App WP7

In Windows Phone 7.5 (Mango), per fare il debug dello stato di una pagina e verificare che abbia il giusto comportamento in caso di tombstoning occorre impostare una specifica opzione nelle proprietà del progetto:

image

questo perché la disattivazione dell’applicazione ora porta allo stato di “Dormant” e finche c’è memoria il S.O. di Windows Phone 7.5 non rimuove dalla memoria l’applicazione e quindi non è possibile verificare il comportamento della nostra applicazione nel passaggio allo stato di “Tombstoned” e ciò che accade a seguito della riattivazione della nostra applicazione.

Settando tale opzione, la deattivazione dell’applicazione porta immediatamente al passaggio di stato “Tombstoned”, così da poter verificare il corretto funzionamento della nostra applicazione, ad esempio per quanto riguarda il ripristino dello stato della pagina.

«novembre»
domlunmarmergiovensab
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910