2016-07-11 50 views
5

Avevo bisogno di scrivere una query dinamica sul database clienti per ottenere pochi campi di un cliente.Prestazioni di IQueryable

seguito è riportato il codice di

[Route("api/getBasicCustList/{argType}/{argValue}")] 
     [HttpGet] 
     [Authorize] 

     public dynamic getCustomerDataUsername(String argType, String argValue) 
     { 
      IQueryable<CustomerDTO> query = 
       (from recordset in db.Customers 
        select new CustomerDTO 
           { 
            companyId = recordset.Company.Id, 
            contactNum = recordset.ContactNum, 
            username = recordset.UserName, 
            emailAddress = recordset.Email, 
            fullName = recordset.FullName, 
            accountNumber = recordset.RCustId 
           } 
       ); 

      switch (argType) 
      { 
       case "username" : 
        query = query.Where(c => c.username.StartsWith(argValue)); 
        break; 
       case "contactnum": 
        long mobNum = Int64.Parse(argValue); 
        query = query.Where(c => c.contactNum == mobNum); 
        break; 
       case "fullname": 
        query = query.Where(c => c.fullName.Contains(argValue)); 
        break; 
      } 

      return new { data = query.ToList() }; 
     } 

questo funziona bene e sta risolvendo il mio scopo.

la mia domanda qui è quando scrivo la mia prima parte della query per ottenere tutti i record dei clienti e successivamente applicare sulle cui condizioni dinamicamente saranno i risultati portati in memoria o la query completa viene generato ed eseguiti al db in un colpo?

Dal momento che ho appena 500 record, non sono in grado di trovare alcun ritardo di prestazioni, ma quando porterò questo alla produzione avrò a che fare con almeno 200.000 a 300.000 record.

+5

La query non verrà eseguita finché non si raggiunge tale "Elenco degli utenti" alla fine del metodo. – Kinetic

+0

oh Bene. !! Potete voi o chiunque altro per favore fornire un link da msdn o qualsiasi articolo online che lo confermi. grazie. –

+2

Qui vai [Query Execution] (https://msdn.microsoft.com/en-us/library/bb738633 (v = vs.100) .aspx). –

risposta

3

ok, la risposta è

non verrà eseguita la query fino a che "ToList" alla fine del metodo

da MSDN link condivisa da @GeorgPatscheider è citato

A che punto le espressioni di query vengono eseguite può variare. Le query LINQ vengono sempre eseguite quando la variabile di query viene iterata sopra, non quando viene creata la variabile di query. Si chiama esecuzione differita

Esecuzione differita consente di combinare più query o di estendere una query . Quando una query viene estesa, viene modificata per includere le nuove operazioni e l'eventuale esecuzione rifletterà le modifiche .

Il suo scritto, inoltre, che se le query hanno alcuna di Average, Count, First, o Max eseguirà un immediata esecuzione.

grazie.

+1

Le prestazioni delle query sono ancora soggette a Sql - ad esempio, ricordare di indicizzare tutte le colonne filtrate nei predicati del caso. Per ragioni di salute, potresti voler standardizzare su Linq Query Syntax o sulla sintassi lambda ... Hai combinato entrambi. – StuartLC