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