为什么这两个查询在Entity Framework中返回不同的结果?

时间:2012-03-16 16:57:09

标签: c# linq entity-framework linq-to-entities

我在Entity Framework中编写了以下查询,其值不同。

var query = from p in db.Parents
            let children = p.Children
            let grandchildren = children.SelectMany(c => c.Grandchildren)
            select new 
            {
                Count1 = children.Count(c => !c.Grandchildren.Any()),
                Count2 = children.Count(c => !grandchildren.Any())
            };

Count1属性返回我期望的内容,Count2没有。

我试图返回没有任何孙子对象的孩子的数量。在这种情况下,Count2似乎返回0,但Count1返回1并带有以下数据集:

父母

Id
------  
1

Id    ParentId
--------------
1     1
2     1

Id    ChildId
-------------
1     1

我有两个孩子,其中只有一个有孩子。为什么第二个查询似乎不像我认为的那样工作?

我的对象如下:

public class Parent {
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

public class Child { 
    public int Id { get; set; }
    public int ParentId { get; set; }
    public virtual ICollection<Grandchild> Grandchildren { get; set; }
}

public class Grandchild {
    public int Id { get; set; }
    public int ChildId { get; set; }
}

2 个答案:

答案 0 :(得分:1)

grandchildren.Any()
如果您的grandchildren集合中有任何对象,

就会返回。因此,除非SelectMany返回零结果,否则它将始终返回true。

所以,除了Count2 = 0之外你永远不会得到任何东西,因为如果有任何结果!grandChildren.Any()将等于0。

答案 1 :(得分:0)

问题在于您的grandchildren范围变量。它包含所有孙子(过滤到特定孩子),因此Count2始终在考虑整个树中是否有任何孙子。< / p>