在完成构建之后执行IQueryable

时间:2015-03-23 01:59:10

标签: c# entity-framework lambda iqueryable deferred-execution

我想根据用户输入在IQueryable上构建过滤器,并仅在最后执行查询。我正在努力理解背后的概念,以及它是否会按预期工作。

以下查询是否会在下面示例中的return fetchedWorkflowLogs.ToList()上点击数据库?

// 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();

1 个答案:

答案 0 :(得分:1)

同意大卫。如果GetAll()返回IQueryable,并且return fetchedWorkflowLogs.ToList()将导致评估linq查询,并且查询将命中数据库。 如果您可以调试并逐步完成它是最好的,如果直接执行程序很困难,编写测试可以帮助您。