martedì 12 marzo 2013

Ottimizzazioni LINQ

1. Any oppure Count?
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.LoadWith(A => A.CustomerAddresses);
            context.LoadOptions = dataLoadOptions;
            foreach (var customer in customer)
                Response.Write(customer.CustomerAddresses.Count().ToString());
        }
In 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.

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: