实体框架SelectMany忽略Where子句

时间:2015-11-27 12:47:59

标签: c# entity-framework

我有一个实体层次结构,例如: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字段。

enter image description here

1 个答案:

答案 0 :(得分:1)

如果project是某个实体实例,并且您正在使用延迟加载,则输出中的SQL是正常的,因为正在客户端执行过滤和分组。在这种情况下,EF无法使用SQL查询过滤子实体。

此处针对数据库的唯一查询是一个查询,它会加载特定Times的{​​{1}}:

Milestone