Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Entity Framework: ottenere le istruzioni SQL inviate al database con Visual Basic 2008

Probabilmente molti di voi sanno che in LINQ-to-SQL è possibile ottenere l’insieme delle istruzioni inviate dal runtime di .NET a SQL Server attraverso l’utilizzo della proprietà Log del DataContext. Ne ho parlato brevemente sia nel mio articolo introduttivo a LINQ-to-SQL che nel mio libro su LINQ.

 

Nell’Entity Framework non c’è una proprietà analoga ma si devono utilizzare diverse tecniche a seconda della tipologia di oggetti che utilizziamo per dialogare con l’EF stesso. Per esempio, gli oggetti EntityCommand e ObjectQuery espongono un metodo chiamato ToTraceString che può essere utilizzato per lo scopo, mentre in LINQ-to-Entities si ricorrerà, come vedremo in fondo al post, a una conversione oppure a un metodo extension personalizzato.

 

I code snippet proposti sono molto semplici e servono più a capire il discorso che non a eseguire query particolarmente complesse. Avremo, tra l’altro, la scusa per vedere come nell’Entity Framework ci siano diverse modalità disponibile per interrogare la sorgente dati. Supponiamo di avere il nostro Entity Data Model che espone un’entità Customers proveniente dall’omonima tabella del database Northwind e di voler recuperare l’elenco dei clienti che vivono nella città di Londra, ottenendo anche l’elenco delle istruzioni SQL inviate da .NET Framework a SQL Server. Per la seguente demo ho utilizzato, per semplicità, un’applicazione Console.

In primo luogo, aggiungiamo le seguenti direttive Imports:

 

Imports System.Runtime.CompilerServices

Imports System.Data.EntityClient

Imports System.Data.Objects

 

La prima ci servirà successivamente quando creeremo un metodo extension, la seconda e la terza abbreviano, rispettivamente, il richiamo agli oggetti EntityCommand e ObjectQuery. Partiamo con un primo esempio, riferibile alla classe EntityCommand:

 

        Dim northwindContext As New NORTHWNDEntities

        'Ottengo la stringa di connessione secondo lo schema utilizzato da Entity Framework

        Dim connection As New EntityConnection(northwindContext.Connection.ConnectionString)

 

        Dim command = "SELECT VALUE Customer FROM NORTHWNDEntities.Customers AS Customer WHERE Customer.City='London'"

 

        'Prima modalità di Trace: EntityCommand

        Dim entityCmd As New EntityCommand(command, connection)

 

        Console.WriteLine(entityCmd.ToTraceString)

        Console.ReadLine()

 

In primo luogo abbiamo ottenuto la stringa di connessione attraverso la proprietà ConnectionString dell’oggetto NorthwindContext.Connection, utilizzata come argomento del costruttore della classe EntityConnection. Tale stringa di connessione è uno dei due argomenti dell’istanza della classe EntityCommand; il primo è proprio la sequenza di istruzioni SQL che vogliamo inviare al db. Questa classe espone un metodo ToTraceString, che compila la sequenza di istruzioni e la restituisce secondo la forma tipica dell’Entity Framework. Una volta eseguito, il predetto codice causa il seguente risultato:

 

 

 

La seconda modalità consiste nell’utilizzare l’Entity SQL, che va ad agire direttamente sul contesto (l’ObjectContext) mediante un metodo chiamato CreateQuery(Of T). Data per invariata la precedente sequenza di istruzioni SQL, il seguente codice sfrutta l’Entity SQL e il metodo ToTraceString dell’istanza dell’ObjectQuery restituita:

 

        'Seconda modalità di Trace: EntitySQL

        Dim entitySqlQuery = northwindContext.CreateQuery(Of Customers)(command)

        Console.WriteLine(entitySqlQuery.ToTraceString)

        Console.ReadLine()

 

Il risultato a video sarà analogo al precedente. La terza modalità riguarda, immancabilmente, LINQ-to-Entities. Le query formulate con LINQ restituiscono, come noto, IQueryable(Of T). Questo tipo di oggetto non prevede un metodo ToTraceString, quindi una buona soluzione è quella di convertire il risultato delle interrogazioni in ObjectQuery, per poi sfruttare il citato metodo:

 

        'Terza modalità: LINQ-to-Entities

        Dim query = From customer In northwindContext.Customers _

                  Where customer.City = "London" _

                  Select customer

 

        Console.WriteLine(CType(query, ObjectQuery(Of Customers)).ToTraceString)

        Console.ReadLine()

 

In questo caso il risultato a video è leggermente differente, poichè (e questa è una delle bellezze di LINQ) la condizione stabilita tramite Where è fortemente tipizzata:

 

 

 

Una quarta modalità può essere costituita dall’implementazione di un metodo extension ToTraceString personalizzato che vada ad estendere la IQueryable e che si occupi di convertire il risultato della query in un ObjectQuery. Il codice è il seguente:

 

<Extension()>Module Extensions

    <Extension()>Function ToTraceString(ByVal query As IQueryable) As String

 

        Dim objQuery = CType(query, ObjectQuery)

 

        Return objQuery.ToTraceString

 

    End Function

End Module

 

E questo è un esempio di utilizzo:

 

        'Quarta modalità: Extension method

        Dim query = (From customer In northwindContext.Customers _

                     Where customer.City = "London" _

                     Select customer).ToTraceString

 

        Console.WriteLine(query)

        Console.ReadLine()

 

In questo modo non dobbiamo eseguire ogni volta la conversione ma abbiamo un metodo che lo fa per nostro conto e che rende più familiare il suo utilizzo in modo simile ad altri operatori di conversione.

 

Alessandro

Print | posted on domenica 14 dicembre 2008 04:22 | Filed Under [ .NET Framework Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET