我有一个实体层次结构,例如:parent
=> child
=> grandchildren
。
我已经加载了parent
个实体,现在我需要选择一个子孙,并在子孙中使用where子句。
我尝试的查询基本上是:
parent.Children
.SelectMany(c => c.GrandChildren.Where(g=>g.BooleanField)) // try here
.Where(g => g.BooleanField) // and try here
.GroupBy(g => new { Name = g.FullName })
.Select(m => new
{
m.Key.Name,
Amount = m.Sum(o => o.DecimalField)
})
.OrderBy(m => m.Name);
虽然没有应用BooleanField
过滤器 - 我可以从SQL跟踪中看到这一点。我有两个地方,为什么不过滤?
实际的实体是项目,里程碑和时间。下面是顶部的实体框架代码和输出窗口下面输出的TSQL的屏幕截图。您可以清楚地看到我有两个WHERE
条款,但TSQL根本不包含IsBillable字段。
答案 0 :(得分:1)
如果project
是某个实体实例,并且您正在使用延迟加载,则输出中的SQL是正常的,因为正在客户端执行过滤和分组。在这种情况下,EF无法使用SQL查询过滤子实体。
此处针对数据库的唯一查询是一个查询,它会加载特定Times
的{{1}}:
Milestone