Spesso sviluppo applicazioni di database SQL utilizzando Linq e la mia metodologia consiste nel costruire classi di modelli per rappresentare ogni tabella e ogni tabella che deve essere inserita o aggiornata ottiene un metodo Save () (che fa anche InsertOnSubmit () o SubmitChanges ( ), a seconda dello stato dell'oggetto). Spesso, quando devo rappresentare una raccolta di record, creerò una classe che eredita da un oggetto tipo List della classe atomica.
es.
public class CustomerCollection : CoreCollection<Customer>
{
}
Recentemente, stavo lavorando a un'applicazione in cui gli utenti finali stavano vivendo una lentezza, in cui ciascuno degli oggetti doveva essere salvato nel database se rispondevano a determinati criteri. Il mio metodo Save () era lento, presumibilmente perché stavo facendo tutti i tipi di round trip sul server e chiamando DataContext.SubmitChanges () dopo ogni salvataggio atomico.
Quindi, il codice potrebbe essere stato simile a questo
foreach(Customer c in customerCollection)
{
if(c.ShouldSave())
{
c.Save();
}
}
Ho lavorato su più strategie per ottimizzare, ma alla fine ho deciso di passare una grande stringa di dati a una stored procedure SQL, in cui la stringa ha tutti i dati che rappresentano i record con cui stavo lavorando: potrebbe essere qualcosa del genere:
CustomerID:34567;CurrentAddress:23 3rd St;CustomerID:23456;CurrentAddress:123 4th St
Quindi, SQL Server analizza la stringa, esegue la logica per determinare l'appropriatezza del salvataggio e quindi Inserisce, Aggiorna o Ignora.
Con C # / Linq che esegue questo lavoro, ha salvato 5-10 record / s. Quando SQL lo fa, ottengo > 100 record / s, quindi non si può negare che Stored Proc sia più efficiente; tuttavia, odio la soluzione perché non sembra quasi pulita o sicura.
La mia vera preoccupazione è che non ho soluzioni migliori che tengano una candela alle prestazioni della soluzione proc memorizzata. Sto facendo qualcosa di evidentemente sbagliato nel modo in cui sto pensando di progettare applicazioni di database? Ci sono modi migliori per progettare applicazioni di database?