小编Cih*_*urt的帖子

具有OR子句的lambda表达式的LINQ where子句和返回不完整结果的空值

问题简而言之

我们有一个在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)

c# lambda delegates expression

13
推荐指数
2
解决办法
12万
查看次数

标签 统计

c# ×1

delegates ×1

expression ×1

lambda ×1