2014-04-17 11 views
5

Ho cercato intorno a un lor per capire questo e non riesco ancora a vedere una buona risposta. Ho cronometrato la stessa query utilizzando Linq e QueryExpression e in genere la versione successiva viene pubblicata molto più rapidamente. Tuttavia, per i molti motivi esposti in più post (compreso il fatto che la sintassi di QueryExpression è orribile), preferisco usare Linq.SDK CRM - Linq è più lento di QueryExpression?

Qualcuno può fornire una spiegazione del motivo per cui la query in QE è più veloce di Linq? Questo sarebbe un problema ambientale (VS 2012, CRM 2011 e 2013, Windows 7, ecc., Cioè piuttosto standard) o per progettazione/architettura è QE più veloce di Linq?

risposta

5

Poiché la query non sa quali campi saranno necessari in seguito, tutte le colonne vengono restituite dall'entità quando solo l'entità viene specificata nella clausola select. Per specificare solo i campi da utilizzare, è necessario restituire un nuovo oggetto nella clausola select, specificando i campi che si desidera utilizzare.

Così, invece di questo:

var accounts = from acct in xrm.AccountSet 
       where acct.Name.StartsWith("Test") 
       select acct; 

Utilizzare questa:

var accounts = from acct in xrm.AccountSet 
       where acct.Name.StartsWith("Test") 
       select new Account() 
       { 
        AccountId = acct.AccountId, 
        Name = acct.Name 
       }; 

controllare questo post ulteriori dettagli.

To Linq or not to Linq

+0

Grazie per la risposta. Tuttavia il mio dubbio riguarda il tempo di esecuzione di una query di linq rispetto a un'espressione di query. Dì che in entrambi i casi restituisco tutti i campi (o del resto, in entrambi i casi restituisco solo 1 campo). Quale query dovrebbe essere più veloce? – aplon

5

La LINQ to CRM provider deve convertire l'espressione LINQ a un Query Expression prima di inviare la richiesta al server, in modo da una query LINQ sta andando sempre essere più lento in quanto ha per generare la prima QueryExpression .

Come sottolinea Scott nella sua risposta, è anche facile non rendersi conto che stai interrogando tutti i campi di un'entità quando usi LINQ. Ciò lo renderebbe ancora più lento poiché lo QueryExpression generato è meno ottimizzato di uno definito in modo esplicito.