【发布时间】:2011-07-16 00:05:02
【问题描述】:
简而言之问题
我们在 Where 子句中使用了一个 lambda 表达式,它没有返回“预期”的结果。
快速总结
在 analysisObjectRepository 对象中,有一些对象在名为 Parent 的属性中也包含父关系。我们正在查询这个 analysisObjectRepository 以返回一些对象。
详情
下面的代码应该做的是,返回包含 ID 值的特定对象的根、第一个子项(直接子项)和孙子项。
在下面的代码中,常识表明,使 3 个单独的 OR 条件中的任何一个为真的所有结果都应与结果一样返回。
List<AnalysisObject> analysisObjects =
analysisObjectRepository
.FindAll()
.Where(x => x.ID == packageId ||
x.Parent.ID == packageId ||
x.Parent.Parent.ID == packageId)
.ToList();
但上面的代码只返回子孙,而不返回根对象(父值为空),这使得
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();
问题
我们是否在 lambda 表达式中遗漏了什么?这是一个非常简单的 3 部分 OR 条件,我们认为应该返回使三个条件中的任何一个为真的任何对象。我们怀疑具有 null Parent 值的根对象可能会导致问题,但无法准确解决。
任何帮助都会很棒。
【问题讨论】:
-
analysisObjectRepository是List<AnalysisObject>吗?如果是这样,则无需调用FindAll。 -
这是什么?无论是使用 LINQ-to-Objects 还是
IQueryable的自定义实现,都可以使 all 有所不同。 -
你能把它减少到一个显示错误行为的对象吗?出现这种情况时x.ID的值和packageId的值是多少?
标签: c# lambda delegates expression