我有一个实体层次结构,例如: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 跟踪中看到这一点。我在两个地方都有,为什么不过滤?
编辑
实际实体是项目、里程碑和时间。这是顶部 Entity Framework 代码的屏幕截图,下方是“输出”窗口中输出的 TSQL。您可以清楚地看到我有两个 WHERE
子句,但 TSQL 根本不包含 IsBillable 字段。
如果 project
是某个实体实例,并且您正在使用延迟加载,那么来自输出的 SQL 是可以的,因为过滤和分组是在客户端执行的。在这种情况下,EF 无法使用 SQL 查询过滤子实体。
此处对数据库的唯一查询是加载特定里程碑
的Times
的查询:
project
.Milestones // this is loaded already for some reason
.SelectMany(m => m.Times /* this causes lazy loading and SQL in output */
.Where(...) // from here everything is being executed in memory)
.Where(...)
...
我是一名优秀的程序员,十分优秀!