2015-07-17 9 views
5

In questo momento sto passando più parametri per una stored procedure con Entity Framework e sembra che questo ..Esiste un modo più pulito o elegante per passare più parametri alla stored procedure SQL utilizzando Entity Framework?

public long AddDealer(Dealer dealer) 
    { 
     return Convert.ToInt32(AWJE.Database.SqlQuery<Dealer>(
      "usp_InsertDealer @Name, @Description", 
      new SqlParameter("@DealerID", dealer.DealerID).Value, 
      new SqlParameter("@Name", dealer.Name), 
      new SqlParameter("@Description", dealer.Description) 
      )); 
    } 

c'è un modo più elegante o un detergente per passare più parametri, invece del modo mostrato? Se mi imbatto in altre stored procedure che hanno molti più parametri da passare, in questo modo sembra che diventerà molto veloce.

+0

stai usando il codice prima o hai generato un edmx? so che in passato ho aggiunto una procedura memorizzata al mio edmx e quindi ho potuto chiamarla come una funzione. https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx – kmacdonald

+0

@kmacdonald, ho scritto le stored procedure e le tabelle in SSMS e poi generato dal database. – Chris

+0

Non so cosa sia esattamente 'usp_InsertAddress' ma mi sembra che tu possa semplicemente usare un'entità e aggiungerla al contesto e' SaveChanges() 'o, se hai bisogno di usare proc memorizzati per le operazioni CUD, mappare i proc memorizzati di conseguenza. Inoltre EF proverà a materializzare il risultato della stored procedure in 'IEnumerable

' quindi non sono abbastanza sicuro di come 'Convert.ToInt32()' dovrebbe funzionare qui. – Pawel

risposta

5

Il tuo esempio di codice non è chiaramente un esempio di lavoro:

  1. Io non vedo come è possibile convertire un oggetto di tipo Dealer a un int.
  2. Se si prevede che il metodo restituisca un long, perché convertire il risultato della stored procedure in un int?
  3. Si passa un parametro @DealerID, ma non fa parte della chiamata SP.
  4. Non sicuro perché uno dei SqlParameter s ha una chiamata a .Value aggiungere su di esso.

Quindi, mi permetta di regolarla, e supponiamo che il punto di partenza è invece qualcosa di simile:

public long AddDealer(Dealer dealer) 
{ 
    return AWJE.Database.SqlQuery<Dealer>(
     "usp_InsertDealer @Name, @Description", 
     new SqlParameter("@Name", dealer.Name), 
     new SqlParameter("@Description", dealer.Description) 
     ).DealerID; 
} 

O forse si decide che la SP restituisce un long direttamente, in questo modo:

public long AddDealer(Dealer dealer) 
{ 
    return AWJE.Database.SqlQuery<long>(
     "usp_InsertDealer @Name, @Description", 
     new SqlParameter("@Name", dealer.Name), 
     new SqlParameter("@Description", dealer.Description) 
     ); 
} 

In entrambi i casi, l'unica semplificazione che vedo è che è possibile modificare l'invocazione su SqlQuery in modo da utilizzare i parametri posizionali anziché i parametri denominati. Effettuare tale modifica consente di rinunciare alla creazione di istanze esplicite SqlParameter. La chiamata potrebbe quindi essere semplificata a questo:

public long AddDealer(Dealer dealer) 
{ 
    return AWJE.Database.SqlQuery<long>(
     "usp_InsertDealer @Name, @Description", 
     dealer.Name, 
     dealer.Description 
     ); 
} 

... dove come si nome @Name o @Description non ha più alcuna importanza, ma è necessario assicurarsi che si passa i valori dei parametri nel giusto ordine.

A parte questo, non so se è possibile renderlo più pulito o più elegante.

+0

Grazie per aver chiarito le cose, sei corretto, non è stato un esempio funzionante perché non ho avuto una possibilità di testare perché ho molto più di quelli da scrivere e stavo testando quest'ultimo, quindi apprezzo la correzione. Quindi uno di quei primi 2 blocchi di codice mi restituirà l'ID di ritorno dalla stored procedure? ed essere in grado di rimuovere i parametri nominati e usare i parametri posizionali ha sicuramente ripulito di più. – Chris

Problemi correlati