2015-03-23 2 views
0

Je souhaite créer des filtres sur IQueryable en fonction de la saisie par l'utilisateur et exécuter la requête uniquement à la fin. J'essaie de comprendre le concept derrière et si cela va fonctionner comme prévu.Exécuter IQueryable une fois qu'il est en cours de construction

La requête ci-dessous affichera-t-elle la base de données sur return fetchedWorkflowLogs.ToList() dans l'exemple ci-dessous?

// Partition latest record for Instance 
IQueryable<WorkflowLog> fetchedWorkflowLogs 
             = this._workflowLog_repo 
              .GetAll() 
              .GroupBy(log => log.ID) 
              .Select(
               grp => new 
               { 
                grp = grp, 
                MaxID = grp.Max(log => log.ID) 
               } 
              ) 
              .SelectMany(
               temp0 => temp0.grp, 
               (temp0, log) => new 
               { 
                temp0 = temp0, 
                log = log 
               } 
              ) 
              .Where(temp1 => (temp1.log.ID == temp1.temp0.MaxID)) 
              .Select(temp1 => temp1.log); 

// .. some more filters           

// Last filter 
// Filter by Project 
if (model.ProjectID != null) 
{ 
    fetchedWorkflowLogs.Where(record => record.Project.ID == model.ProjectID); 
} 

return fetchedWorkflowLogs.ToList(); 
+0

Eh bien, cela pourrait dépendre de ce que 'GetAll()' fait. Vous pouvez tester cela en parcourant le débogueur lors du profilage de la base de données. Mais essentiellement, oui, des choses comme 'Select()' et 'Where()' construisent une arborescence d'expression qui n'est pas évaluée tant que la collection n'est pas matérialisée avec quelque chose comme 'ToList()'. – David

+0

@David Cela se fait après 'return _db.WorkflowLogs.AsQueryable();' – skmasq

Répondre

1

D'accord avec David. si GetAll() renvoie IQueryable, et return fetchedWorkflowLogs.ToList() résultera dans l'évaluation de la requête linq, et la requête atteindra la base de données. C'est le meilleur si vous pouvez déboguer et passer à travers, et l'écriture d'un test pourrait vous aider si l'exécution du programme directement est difficile.

+0

Y at-il des méthodes qui pourraient exécuter prématurément le 'IQueryable'? – skmasq

+0

https://msdn.microsoft.com/en-us/library/vstudio/bb738633(v=vs.100).aspxÀ quel point les expressions de requête sont exécutées peuvent varier. Les requêtes LINQ sont toujours exécutées lorsque la variable de requête est répétée, et non lorsque la variable de requête est créée. C'est ce qu'on appelle l'exécution différée. Vous pouvez également forcer l'exécution immédiate d'une requête, ce qui est utile pour la mise en cache des résultats de la requête. Ceci est décrit plus tard dans cette rubrique. –

+0

inclut: ToArray, ToList, ToDictionary, ForEach, ToLookup, Moyenne, Nombre, Premier et Max –