2012-05-30 12 views
15

Sto lavorando ad un nuovo progetto che deve utilizzare Linq To SQL. Mi è stato chiesto di creare una classe Linq to SQL generica o riutilizzabile che può essere utilizzata per eseguire stored procedure.Creazione di Linq riutilizzabile in SQL per stored procedure

In ADO.Net sapevo come fare questo da solo di passaggio in una serie di quello che volevo eseguire e ho potuto passare in diverse stringhe per ogni query ho bisogno di correre:

SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc 

sto lottando con come creare qualcosa di simile in Linq To SQL, se è anche possibile. Ho creato un file .dbml e aggiunto la mia stored procedure ad esso. Di conseguenza, posso restituire i risultati utilizzando il codice qui sotto:

public List<myResultsStoreProc> GetData(string connectName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.myResultsStoreProc(); 

    return query.ToList(); 
} 

Il codice funziona ma vogliono me per creare un metodo che restituirà tutto ciò stored procedure lo dico a correre. Ho cercato online e ho parlato con i colleghi di questo argomento e non ho avuto successo nel trovare un modo per creare una classe proc memorizzata riusabile.

Quindi c'è un modo per creare una classe riutilizzabile Linq to SQL per eseguire proc memorizzati?

Edit:

Quello che sto cercando è se c'è un modo per fare qualcosa di simile alla seguente?

public List<string> GetData(string connectName, string procedureName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.procedureName(); 

    return query.ToList(); 
} 

Ho rivisto il MSDN docs su Linq To Sql e questi sono che mostra la tabella nella IEnumerable:

IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName 
     from customer1 as c1, customer2 as c2 
     where c1.custid = c2.custid" 
); 

Cerco qualcosa di molto generico, dove posso inviare un valore stringa della stored proc che voglio eseguire. Se questo non è possibile, c'è qualche documentazione sul perché non può essere fatto in questo modo? Ho bisogno di dimostrare il motivo per cui non siamo in grado di passare un valore di stringa del nome della procedura da eseguire in Linq To Sql

+0

Avete bisogno di eseguire le stored procedure che non si può avere modellate nel file .dbml? E vuoi restituire entità mappate nel tuo .dbml? – CodingGorilla

+0

molto probabilmente saranno mappati nel .dbml ma suppongo che potrebbe esserci un caso in cui non era – Taryn

+0

Questo non è il modo in cui LINQ to SQL dovrebbe essere usato. Stai lavorando contro il sistema. Prova a lavorare come dovrebbe essere usato. – usr

risposta

16

DataContext.ExecuteCommand non è proprio quello che stai cercando, in quanto restituisce solo un valore int. Quello che vuoi invece è DataContext.ExecuteQuery, che è in grado di eseguire una stored procedure e restituire un set di dati.

Vorrei creare una classe parziale per il DBML in cui memorizzare questa funzione.

public List<T> GetDataNoParams(string procname) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname); 

    return query.ToList(); 
} 

public List<T> GetDataParams(string procname, Object[] parameters) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname, parameters); 

    return query.ToList(); 
} 

Per chiamare una stored procedure si dovrebbe fare:

GetDataNoParams("myprocedurename"); 

o

GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345); 

o

GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345); 

Se si desidera chiamare procedure senza valore di ritorno che è anche abbastanza facile, come sono sicuro Puoi vedere, creando un nuovo metodo che non memorizza/restituisce nulla.

L'ispirazione proviene da http://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspx.

+0

Il file DBML sta andando a dire al metodo 'ExecuteQuery ' cosa 'T' è in modo che i dati possano essere schiacciati in istanze di oggetto? – bluevector

+0

No, tu dici quello che è quando lo chiami. Negli esempi si presuppone che gli oggetti siano già mappati ai tipi restituiti per ciascuna stored procedure. Pertanto, se si dispone di una stored procedure che restituisce i clienti e si dispone di un tipo di oggetto cliente, passare in Cliente per T. – Peter

+0

Gotcha. Quindi non stiamo provando a "IQueryable'-ify stored procs e niente deve essere onnisciente. – bluevector

2

La risposta più semplice alla tua domanda è che si può afferrare la proprietà Connection del vostro MyDataContext e creare ed eseguire i propri SqlCommand s proprio come faresti su ADO.Net. Non sono sicuro che ciò servirà ai tuoi scopi, specialmente se vuoi recuperare entità dal tuo LINQ al modello SQL.

Se si desidera restituire entità dal modello, consultare il metodo DataContext.ExecuteCommand.

+0

Grazie per la direzione, ma puoi fornire ulteriori informazioni su come posso passare una stringa con il nome della procedura che voglio eseguire . – Taryn

+0

@bluefeet Vedi la risposta di Peter, ha un paio di esempi decenti. – CodingGorilla

0

Quando rilasciamo un Table o StoredProcedure nel nostro file .dbml, crea la sua classe che comunica con il livello dati e la nostra logica aziendale.

In Linq a SQL dobbiamo avere le StoredProcedures o Tabelle presenti nel file .dbml altrimenti non c'è modo di chiamare un metodo generico in Linq a SQL per chiamare una stored procedure passando il suo nome ad un metodo.

Ma in ADO.Net possiamo farlo (come si sa)

SqlCommand cmd = new SqlCommand("myStoredProc", conn); 
Problemi correlati