Почему эти два запроса возвращают разные результаты в Entity Framework? - PullRequest
0 голосов
/ 16 марта 2012

Я написал следующий запрос в 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 со следующим набором данных:

Parents

Id
------  
1

Child

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 ]

1 голос
/ 16 марта 2012
grandchildren.Any()

просто возвращается, если в вашей коллекции grandchildren есть какие-либо объекты. Так что он всегда будет возвращать true, если ваш SelectMany не вернет ноль результатов.

Таким образом, вы никогда не получите ничего, кроме Count2 = 0, потому что если будут какие-либо результаты, !grandChildren.Any() будет равно 0.

0 голосов
/ 16 марта 2012

Проблема с вашей переменной диапазона grandchildren.Он содержит всех внуков (, а не , отфильтрованных по конкретному дочернему элементу), поэтому Count2 всегда учитывает, есть ли любых внуков во всем дереве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...