Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在它之后执行IQueryable';正在建造什么_C#_Entity Framework_Lambda_Iqueryable_Deferred Execution - Fatal编程技术网

C# 在它之后执行IQueryable';正在建造什么

C# 在它之后执行IQueryable';正在建造什么,c#,entity-framework,lambda,iqueryable,deferred-execution,C#,Entity Framework,Lambda,Iqueryable,Deferred Execution,我想根据用户输入在IQueryable上构建过滤器,并仅在最后执行查询。我正在努力理解背后的概念,以及这是否会像预期的那样起作用 在下面的示例中,下面的查询是否会在返回fetchedWorkflowLogs.ToList()时命中数据库 // Partition latest record for Instance IQueryable<WorkflowLog> fetchedWorkflowLogs

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

在下面的示例中,下面的查询是否会在
返回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();
//对实例的最新记录进行分区
IQueryable获取的工作流日志
=此.\u工作流程日志\u报告
.GetAll()
.GroupBy(log=>log.ID)
.选择(
grp=>新
{
grp=grp,
MaxID=grp.Max(log=>log.ID)
}
)
.SelectMany(
temp0=>temp0.grp,
(temp0,log)=>新建
{
temp0=temp0,
对数=对数
}
)
.Where(temp1=>(temp1.log.ID==temp1.temp0.MaxID))
.Select(temp1=>temp1.log);
// .. 再来一些过滤器
//最后一个过滤器
//按项目筛选
if(model.ProjectID!=null)
{
fetchedWorkflowLogs.Where(record=>record.Project.ID==model.ProjectID);
}
返回fetchedWorkflowLogs.ToList();

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

好的,这可能取决于
GetAll()
的功能。您可以通过在分析数据库时单步执行调试器来测试这一点。但是本质上,是的,像
Select()
Where()
这样的东西建立了一个表达式树,直到集合用
ToList()
@David()之类的东西具体化之后,才会对其进行计算是否有任何方法会过早执行
IQueryable
?执行的点查询表达式可能有所不同。LINQ查询总是在迭代查询变量时执行,而不是在创建查询变量时执行。这称为延迟执行。您还可以强制立即执行查询,这对于缓存查询结果很有用。这将在本主题后面介绍。它包括:ToArray、ToList、ToDictionary、ForEach、ToLookup、Average、Count、First和Max