Torna al Thread
EntityClient + Entity SQL
Scrivere il codice con l'API EntityClient offre il controllo più capillare delle tre tecniche. È possibile creare un EntityConnection per connettersi a EDM, scrivere una query in Entity SQL ed eseguirla con un EntityCommand e restituire i risultati tramite DbDataReader. Questa tecnica è anche un po' più leggera perché allevia la pesantezza sintattica di LINQ e Object Services.
Il grande vantaggio di Entity SQL è la flessibilità. La sintassi basata su stringhe si presta facilmente a creare query dinamiche. Ciò può essere molto utile quando è necessario creare una query ad hoc.
Tuttavia, un effetto di questa flessibilità e leggerezza è che i risultati possono essere restituiti solo tramite DbDataReader. Non è possibile restituire entità pure da EDM usando EntityClient con Entity SQL. È possibile recuperare e usare DbDataReader per scorrere l'insieme di righe che soddisfano la query Entity SQL. Il codice nella Figura 1 consente di scorrere i record dei clienti tramite DbDataReader ma non le entità Customers.
Object Services + Entity SQL
La prossima tecnica è l'uso di Object Services per eseguire query con Entity SQL. Questa tecnica si allontana dall'interazione diretta con il provider EntityClient (sebbene comunichi ancora tranquillamente con il provider). Si usano ObjectContext e ObjectQuery<T> per emettere query su EDM.
Questa tecnica è valida per emettere query ad hoc, come la prima tecnica. Tuttavia, invece di restituire i dati tramite DbDataReader, l'uso di Object Services con Entity SQL consente di restituire entità da EDM. Si tratta di una solida combinazione: query flessibili che restituiscono entità di prima classe.
Poiché Entity SQL attualmente è privo di costrutti DML, non è possibile emettere comandi Insert, Update o Delete usando Entity SQL e Object Services. È possibile comunque recuperare un'entità da EDM usando questa tecnica e quindi aggiornare l'entità usando il metodo SaveChanges in ObjectContext
Object Services + LINQ
L'uso di Object Services con LINQ non è valido per le query ad hoc come nelle altre tecniche
Proprio come Entity SQL, anche LINQ non supporta la sintassi diretta per le istruzioni DML. Attualmente è possibile solo aggiornare le entità per un database quando si usa Object Services (per mezzo del metodo SaveChanges). Ciò avviene restituendo le entità da EDM, le cui modifiche vengono registrate da Entity Framework. In breve, né LINQ né Entity SQL eseguono operazioni di aggiornamento; è ObjectContext di EDM a farle.
Riepilogo le differenze tra queste tecniche nella Figura 2. Pertanto, perché si dovrebbe usare Entity SQL quando si ha già LINQ? Entity SQL è un'ottima scelta quando servono query ad hoc o si desidera creare una query più flessibile di quanto non lo sia con LINQ. Altrimenti suggerisco di usare LINQ con Object Services in modo da poter sfruttare la forte tipizzazione e la capacità di restituire entità e proiezioni.
Oltre alla sintassi fortemente tipizzata di LINQ, si ottengono anche viste dei tempi di progettazione che diversamente non sarebbero disponibili fino all'esecuzione dell'applicazione. Apprezzo veramente questa funzione: mi consente di continuare a scrivere codice invece di dover creare ed eseguire per catturare gli errori.