Diciamo che abbiamo classi come questa:
public class Item1{
public Guid Id {get; set;}
public string Name {get; set;}
public decimal Price {get; set;}
public int Quantity {get; set;}
}
E alcuni altri, che hanno campi aggiuntivi o diversi, altri hanno liste come proprietà.
E quelle classi vengono serializzate in stringhe Xml e posizionate come proprietà di un'altra classe, che verrà salvata nel database.
public class Record{
public Guid Id {get; set;}
public DateTime CreatedOn {get; set;}
public string SerializedItem {get; set;}
}
Quando è necessario, estraiamo il record e deserializziamo in classe Item1
, Item2
o altro. Tutto è bello e bello.
Ma un giorno decidiamo che abbiamo bisogno di una proprietà aggiuntiva Discount
. Se lo sconto Price * Quantity > 1000
sarebbe 10
per quell'elemento, se superiore a 5000 sconto 20 e così via. E useremmo quelle classi per mostrarle in una griglia (lista semplice), generare report e probabilmente come una variabile in classi (ad esempio se lo sconto è maggiore di 20 quella voce non potrebbe ottenere una spedizione gratuita o qualcosa del genere). Per non duplicare il calcolo di Discount
, decidiamo di avere proprietà aggiuntive nella nostra classe Item1
come public decimal Discount {get; set;}
, che viene calcolata durante l'inserimento di questo nuovo elemento.
Quindi ecco il problema che vediamo: quando deserializzando i vecchi articoli non avrebbero questa proprietà, quindi deserializzatore darebbe valori predefiniti come null
, 0
, false
a seconda del tipo di proprietà. Tuttavia, vogliamo che i vecchi articoli abbiano un valore Discount
calcolato in base alla logica che vengono calcolati i nuovi articoli Discount
.
Quindi come ottenerlo in modo efficiente? Sarebbe saggio avere un metodo che ricalcoli lo sconto (si noti che potrebbero esserci un paio di migliaia di elementi e la logica sarebbe più complicata) prima di dare questi elementi alla griglia, ai report e da qualche altra parte? O è più efficiente avere uno script che esegua il loop di tutti i record e calcoli lo sconto, ed eseguirlo una volta dopo l'aggiornamento alla nuova versione?
Qualche intuizione e suggerimento sono apprezzati. E fammi sapere o modificare se titolo e tag sono inappropriati o troppo vaghi.