короче проблема
у нас есть лямбда-выражение, используемое в предложении 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, может вызвать проблему, но не могли понять ее точно.
любая помощь будет большой.