LINQ cláusula where com expressão lambda com cláusulas OR e valores nulos retornando resultados incompletos

o problema em suma

nós temos uma expressão lambda usada na cláusula Where, que não está retornando o resultado "esperado"

esumo rápido

No objeto analysisObjectRepository, existem certos objetos que também contêm o relacionamento pai em uma propriedade chamada Parent. estamos consultando este analysisObjectRepository para retornar alguns objetos.

detalh

o que o código abaixo deveria fazer é retornar a raiz, os primeiros filhos (filhos imediatos) e os netos de um objeto específico que contém o valor do I

No código abaixo, o senso comum diz que todos os resultados que tornam verdadeiras as três condições OR separadas devem ser retornados como nos resultado

List<AnalysisObject> analysisObjects = 
    analysisObjectRepository
        .FindAll()
        .Where(x => x.ID               == packageId ||
                    x.Parent.ID        == packageId || 
                    x.Parent.Parent.ID == packageId)
        .ToList();

mas o código acima retorna apenas os filhos e netos, sem retornar os objetos raiz (com um valor nulo de Pai) que tornam o

x.ID == packageId

condição verdadeira.

penas objetos que compõem o segundo

x.Parent.ID == packageId

e terceiro

x.Parent.Parent.ID == packageId

clauses são retornados.

Se escrevermos apenas o código para retornar o objeto raiz com o código abaixo, ele será retornado, portanto, temos certeza absoluta de que analysisObjectRepository contém todos os objetos

List<AnalysisObject> analysisObjects = 
    analysisObjectRepository
        .FindAll()
        .Where(x => x.ID == packageId )
        .ToList();

No entanto, quando reescrevemos como delegado, obtemos o resultado esperado, retornando todos os objetos esperado

List<AnalysisObject> analysisObjects = 
    analysisObjectRepository
        .FindAll()
        .Where(delegate(AnalysisObject x) 
        { 
            return 
              (x.ID == packageId) || 
              (x.Parent != null && x.Parent.ID == packageId) || 
                  (x.Parent != null && 
                   x.Parent.Parent != null && 
                   x.Parent.Parent.ID == packageId); })
        .ToList();

questã

Estamos perdendo algo na expressão lambda? é uma condição OR de 3 partes realmente simples e achamos que qualquer objeto que torne verdadeira uma das três condições deve ser retornado. suspeitamos que o objeto raiz com um valor pai nulo possa causar um problema, mas não conseguimos descobrir exatamente.

Qualquer ajuda seria ótimo

questionAnswers(3)

yourAnswerToTheQuestion