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.

posted @ lunedì 21 novembre 2011 18:06

Print

Comments on this entry:

# Visualizzare il comando SQL emesso da LinqToSQL

Left by Il Blog di Nicol at 04/12/2011 02:36
Gravatar
Visualizzare il comando SQL emesso da LinqToSQL
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011