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