2016-07-11 9 views
5

Ich musste eine dynamische Abfrage in der Kundendatenbank schreiben, um einige Felder eines Kunden zu erhalten.Leistung von IQueryable

folgenden ist der Code

[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() }; 
     } 

das funktioniert gut und mein Ziel ist die Lösung.

meine Frage hier ist, wenn ich mein erster Teil der query schreiben alle die Kundendaten zu erhalten und später gilt die in dem Zustand dynamisch die Ergebnisse im Speicher oder die komplette Abfrage erzeugt und an db ausgeführt gebracht werden In einem Schuss?

Da ich jetzt nur 500 Datensätze habe, kann ich keine Performance-Verzögerung finden, aber wenn ich das zur Produktion nehme, werde ich mit mindestens 200.000 bis 300.000 Datensätzen handeln.

+5

Die Abfrage wird nicht ausgeführt, bis Sie diese "ToList" am Ende Ihrer Methode erreicht haben. – Kinetic

+0

oh Gut. !! Können Sie oder jemand anderes einen Link von msdn oder einem Online-Artikel, der dies bestätigt, bereitstellen? Danke. –

+2

Hier gehen Sie [Abfrageausführung] (https://msdn.microsoft.com/en-us/library/bb738633 (v = vs.100) .aspx). –

Antwort

3

ok, ist die Antwort

Die Abfrage wird nicht ausgeführt, bis Sie erreichen, dass „ToList“ am Ende Ihrer Methode

aus der MSDN link von @GeorgPatscheider geteilt es ist

An welchem ​​Punkt Abfrageausdrücke ausgeführt werden, kann variieren. LINQ-Abfragen werden immer ausgeführt, wenn die Abfragevariable iteriert wird, nicht wenn die Abfragevariable erstellt wird. Dies wird als verzögerte Ausführung

aufgeschobene Ausführung ermöglicht mehrere Abfragen kombiniert werden oder eine Abfrage erweitert werden. Wenn eine Abfrage erweitert wird, wird sie so geändert, dass sie die neuen Operationen enthält, und die eventuelle Ausführung spiegelt die Änderungen wider.

Sein geschrieben auch, dass, wenn für Anfragen haben alle Average, Count, First oder Max es wird eine sofortige Ausführung durchzuführen.

danke.

+1

Abfrage Leistung unterliegt noch Sql - z. B. vergessen Sie nicht, alle gefilterten Spalten in den Fallprädikaten zu indizieren. Aus Gründen der Vernunft möchten Sie vielleicht die Abfragesyntax von Linq oder die Lambda-Syntax standardisieren ... Sie haben beides kombiniert. – StuartLC