Quando si deve verificare la presenza di almeno un elemento in una collection o una lista, è meglio utilizzare
if (query.Any())al posto di
if (query.Count() > 0)In questo modo l'elaborazione si ferma al primo che trova.
2. Condizioni
È preferibile utilizzare
query.FirstOrDefault(x => x.value > 1); query.SingleOrDefault(x => x.value > 1);invece che
query.Where(x => x.value > 1).FirstOrDefault(); query.Where(x => x.value > 1).SingleOrDefault();In questo modo viene eseguita una sola operazione invece che due operazioni concatenate.
3. Capire come funziona
Usando LINQ è sempre necessario cercare le performance migliori, per questo motivo è fondamentale capire bene come funziona internamente.
using (MYDataContext context = new MYDataContext()) { var customers = from cust in context.Customers select cust; foreach (var customer in customer) Response.Write(customer.CustomerAddresses.Count().ToString()); }Nell'esempio precedente, da un'analisi con il Sql Server Profiler si nota che ogni volta che l'oggetto customer viene enumerato dentro il ciclo foreach viene eseguita una query per determinare il numero di indirizzi. ora consideriamo invece il seguente snippet:
using (MYDataContext context = new MYDataContext()) { var customers = from cust in context.Customers select cust; DataLoadOptions dataLoadOptions = new DataLoadOptions(); dataLoadOptions.LoadWithIn questo esempio, usando DataLoadingOptions stiamo dicendo al motore di query LINQ che mentre si carica i dati da Customer deve anche associare direttamente i record della tabella CustomerAddresses. Il "beneficio" è che in questo caso viene eseguita UNA sola query per avere il risultato finale.(A => A.CustomerAddresses); context.LoadOptions = dataLoadOptions; foreach (var customer in customer) Response.Write(customer.CustomerAddresses.Count().ToString()); }
4. Infine...
Il successo dietro ad un'applicazione che fa uso di LINQ spesso sta dietro alle performance delle query scritte. Esistono diversi tool di terze parti che aiutano a sviluppare e ottimizzare le query LINQ, io preferisco e consiglio LINQPad (by Joseph Albahari).
Nessun commento:
Posta un commento