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();
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
@David Cela se fait après 'return _db.WorkflowLogs.AsQueryable();' – skmasq