Se state pensando di una mossa nel mondo del LINQ e Entity Framework, è necessario considerare la possibilità che LINQ e Entity Framework non permette di rilasciare qualche dichiarazione stranamente complicato SQL. Non preoccupatevi - che dovrebbe sempre accadere, avete opzioni.
Da Peter Vogel
Se temete che i vostri requisiti di accesso dati sono sufficientemente "interessante" che LINQ e Entity Framework non può fare il lavoro, la buona notizia è che si può sempre usare vecchio piano SQL. Entity Framework 1 offre un supporto per il rilascio delle istruzioni SQL e Entity Framework 4 ti dà di più.
Due precisazioni prima di iniziare: Per prima cosa, in questa colonna non ho intenzione di fare uno sforzo per venire con le istruzioni SQL che non possono essere gestiti tramite LINQ. In secondo luogo, sto dando per scontato che hai già generato un modello Entity Framework (aggiunto un modello di ADO.NET Entity al progetto, collegato ad un database, e ha lavorato attraverso la procedura guidata per aggiungere alcune tabelle del modello).
Arrivare a ADO.NET in EF 1
Se si desidera recuperare i dati dal database con un'istruzione SQL arbitrario, è possibile utilizzare le informazioni memorizzate nel modello Entity Framework per l'integrazione con gli oggetti ADO.NET si ha familiarità con. Queste tre righe di codice (con queste direttive) recuperare un oggetto SQLConnection dal mio modello Entity Framework:
utilizzando System.Data.Objects; utilizzando northwndModel, utilizzando System.Data.SqlClient; utilizzando System.Data.EntityClient; using System.Data; northwndEntities ne northwndEntities = new Date (); econn EntityConnection = (EntityConnection) ne.Connection; SqlConnection sConn = (SqlConnection) econn.StoreConnection;
Con l'oggetto SqlConnection in mano, io sono libero di rilasciare alcuna dichiarazione SQL che voglio contro il mio database. Basta ricordare che se si fa un aggiornamento tramite ADO.NET, tutti gli oggetti già recuperati tramite Entity Framework non riflette i cambiamenti - utilizzare il metodo Refresh ObjectContext di sincronizzare i vostri soggetti con i tuoi dati. Questo esempio aggiornare alcuna oggetti Customer recuperati in precedenza con gli ultimi dati dal database:
ne.Refresh (RefreshMode.StoreWins, ne.Customers);
Integrazione con EF 4
Ma, in Entity Framework 4, c'è un modo più semplice per eseguire query e lo si può fare in un object-oriented tipo di strada: utilizzare il metodo ExecuteStoreQuery. ExecuteStoreQuery è un metodo generico che consente di specificare una classe per contenere i dati recuperati. Il metodo creerà automaticamente tutte le istanze necessarie della classe e impostare le proprietà gli oggetti risultanti con i valori corrispondenti nomi delle colonne nei dati recuperati.
Se, per esempio, voglio aderire tabelle Clienti e Ordini insieme e recuperare il CustomerId da entrambe le tabelle (e la OrderId dalla tabella Orders), comincio con l'aggiunta di una classe con una proprietà per ogni colonna che voglio:
public class CustomerOrder {public string CustomerId; stringa pubblico OrderCustomerId; public int OrderId;}
Ora posso eseguire un'istruzione SQL che recupera il OrderId e le due ID cliente (alias una delle colonne CustomerId in modo che possa essere utilizzato per aggiornare la proprietà a destra):
northwndEntities ne northwndEntities = new Date (); var = resESQ ne.ExecuteStoreQuery("SELECT Customers.CustomerID", "Orders.OrderId," + "Orders.OrderId Come OrderCustomerId" + "Da Iscriviti Ordini Clienti su" + "I clienti . CustomerId = Orders.CustomerID; ");
Il risultato è una collezione che possono essere trattati con un ciclo foreach o manipolati con LINQ.
Le query con parametri
Se si utilizza una query con parametri, quindi è possibile passare i valori per i parametri come secondo parametro al metodo ExecuteStoreCommand. Questo esempio utilizza due parametri nella sua query:
parms [0] = "BC"; parms [1] = "Victoria"; var = resESQ ne.ExecuteStoreQuery ("Select ..." + "Dove Regione = {0} e Città = {1}", parms);
Questo secondo parametro può utilizzare una varietà di formati. Nell'esempio precedente ho usato la stessa delimitatori {} che il metodo Format della classe string 'utilizza. Ma è anche possibile utilizzare i parametri oggetto come questo esempio fa:
var = resESQne.ExecuteStoreQuery ("Select ..." + "Dove Regione = @ p0 e City = @ P1", parms);
Se avete familiarità con ADO.NET, probabilmente siete più comodi con l'utilizzo di oggetti SqlParameter:
SqlParameter [] parms = SqlParameter nuovo [2]; parms [0] = SqlParameter nuovo ("City", "Victoria"); parms [1] = SqlParameter nuovo ("Regione", "BC");; var = resESQ ne . ExecuteStoreQuery ("Select ..." + "Dove Regione = @ regione e città = @ City", parms);
E, se stai passando un solo parametro, non c'è nemmeno bisogno di creare un array per i parametri:
SqlParameter parm = SqlParameter nuovo ("Regione", "BC");; var resESQ ne.ExecuteStoreQuery = ("Select ...." + "Dove Regione = @ Regione", parm);
Sfruttando Entity Framework
Se stai combinando colonne da diverse classi diverse, creando una classe personalizzata è la strada da percorrere. Ma se ciò che si vuole recuperare è uno dei soggetti del modello - se nessuno dei tuoi SQL "interessante" è nel vostro clausola Select - perché non utilizzare le classi che Entity Framework ha generato per voi? Tra gli altri benefici di cui sopra, si ottiene il rilevamento delle modifiche di Entity Framework, il che significa che è possibile utilizzare Entity Framework per gestire gli aggiornamenti.
Per sfruttare le entità Entity Framework, oltre a specificare la classe da utilizzare, è necessario passare ExecuteStoreQuery il nome della (tabella) EntitySet gli oggetti provengono da e MergeOption che controlla come nuovi oggetti recuperati dal metodo sono combinate con quelle recuperate prima. Questo esempio specifica che la mia classe di entità Customer deve essere utilizzato da ExecuteStoreQuery. Una volta ho recuperato i risultati, li ho aggiornare e salvare il tutto nel database:
northwndEntities ne northwndEntities = new Date (); var = resESQne.ExecuteStoreQuery ("Select * from clienti", "Clienti", System.Data.Objects.MergeOption.PreserveChanges); foreach (Customer cust in resESQ) {cust. Città = "Saqinaw";} ne.SaveChanges ();
Manipolazione Aggiornamenti
Se il vostro "interessante" SQL è una query di aggiornamento, è possibile utilizzare il metodo ExecuteStoreCommand ObjectContext, come questo:
ne.ExecuteStoreCommand ("I clienti aggiornamento Set Città = 'Goderich'");
Si riconosce che, con ExecuteStoreCommand, hai bypassato Entity Framework quindi è necessario utilizzare il metodo Refresh per mantenere il vostro modello in sincronia con i tuoi dati.
Non si è mai possibile che avrete bisogno di questi strumenti - che LINQ e Entity Framework farà tutto il necessario. Ma è bene sapere che sono lì quando le cose iniziano a farsi "interessante
Nessun commento:
Posta un commento
Nota. Solo i membri di questo blog possono postare un commento.