Предложение LINQ с лямбда-выражением, содержащим предложения OR и нулевые значения, возвращающие неполные результаты

короче проблема

у нас есть лямбда-выражение, используемое в предложении Where, которое не возвращает «ожидаемый» результат.

quick summary

в объекте analysisObjectRepository есть определенные объекты, которые также содержат родительские отношения в свойстве с именем Parent. мы запрашиваем этот analysisObjectRepository для возврата некоторых объектов.

detail

то, что должен делать приведенный ниже код, - это возвращать корень, первые дочерние элементы (непосредственные дочерние элементы) и внуки определенного объекта, содержащего значение идентификатора.

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

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

, но приведенный выше код возвращает только потомков и внуков, но не возвращает корневые объекты (с нулевым значением Parent), что делает условие

x.ID == packageId

истинным.

возвращаются только объекты, которые составляют второе

x.Parent.ID == packageId

и третье

x.Parent.Parent.ID == packageId

предложения.

Если мы напишем только код для возврата корневого объекта с приведенным ниже кодом, он будет возвращен, поэтому мы полностью уверены, что analysisObjectRepository содержит все объекты

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

Однако, когда мы переписываем его как делегат, мы получаем ожидаемый результат, возвращая все ожидаемые объекты.

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();

question

Мы что-то упускаем в лямбда-выражении? это действительно простое условие ИЛИ из трех частей, и мы думаем, что любой объект, который делает любое из трех условий истинным, должен быть возвращен. мы подозревали, что корневой объект, имеющий нулевое значение Parent, может вызвать проблему, но не могли понять ее точно.

любая помощь будет большой.

13
задан Aviad P. 15 March 2011 в 17:47
поделиться