问题简而言之
我们有一个在Where子句中使用的lambda表达式,它不会返回"预期"结果.
快速摘要
在analyzeObjectRepository对象中,某些对象也包含名为Parent的属性中的父关系.我们正在查询此analyzeObjectRepository以返回一些对象.
详情
下面的代码应该做的是,返回包含ID值的特定对象的根,第一个子节点(直接子节点)和孙子节点.
在下面的代码中,常识表示所有使3个单独的OR条件中的任何一个成为真的结果应该在结果中返回.
List<AnalysisObject> analysisObjects =
analysisObjectRepository
.FindAll()
.Where(x => x.ID == packageId ||
x.Parent.ID == packageId ||
x.Parent.Parent.ID == packageId)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但上面的代码只返回子孙,而不返回根对象(使用null父值)
x.ID == packageId
Run Code Online (Sandbox Code Playgroud)
条件是真的.
只有制作第二个的对象
x.Parent.ID == packageId
Run Code Online (Sandbox Code Playgroud)
第三
x.Parent.Parent.ID == packageId
Run Code Online (Sandbox Code Playgroud)
条款被退回.
如果我们只编写代码以使用下面的代码返回根对象,则返回它,因此我们完全确定analyzeObjectRepository包含所有对象
List<AnalysisObject> analysisObjects =
analysisObjectRepository
.FindAll()
.Where(x => x.ID == packageId )
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是,当我们将其重写为委托时,我们得到预期的结果,返回所有预期的对象.
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 …Run Code Online (Sandbox Code Playgroud)