空检查嵌套的lambda

时间:2014-05-26 13:27:55

标签: c# .net

我目前正在使用lambda来设置属性。

Team = department.Teams
                 .Where( t => t.GUID == a.Personnel.Roles
                        .Where(r=>r.Department==department && r.EndDate==null)
                        .SingleOrDefault()
                        .DeptTeamGUID)
                 .FirstOrDefault().Name

部门有很多团队。人员具有与该团队相关联的角色。 PersonnelRole包含有关部门的数据以及角色所属的团队。

然而,有时一个人员可以在没有团队的情况下担任角色。在这种情况下,我得到一个"对象引用未设置为对象的实例。"例外。

我还尝试修改lambda以过滤掉没有DeptTeamGUID的角色,但我的逻辑似乎已经关闭。

Team = department.Teams
                 .Where( t => t.GUID==a.Personnel.Roles
                         .Where( r => r.Department==department && r.EndDate==null 
                                      && r.DeptTeamGUID !=null)
                         .SingleOrDefault().DeptTeamGUID)
                 .FirstOrDefault().Name

有人能引导我朝正确的方向前进吗?

1 个答案:

答案 0 :(得分:3)

您正在获取空引用异常,因为当您使用构造.SingleOrDefault().PropertyName执行此操作时,尝试从空引用读取属性。

您必须将.SingleOrDefault().PropertyName更改为.Select(x => x.PropertyName).SingleOrDefault(),如下所示:

Team = department.Teams
    .Where(t => t.GUID == a.Personnel.Roles
        .Where(r => r.Department == department && r.EndDate == null)
        .Select(x => x.DeptTeamGUID)
        .SingleOrDefault()
    )
    .Select(x => x.Name)
    .FirstOrDefault();

注意:这应该会有效,但由于t.Guid == null不是true,因此查询不会返回没有团队的人员案例。

另一个注意事项:我怀疑您可能会错过一些您通常会期望的结果,因为您在子查询中使用了.SingleOrDefault()。也许您应该使用.Contains(...)来检查所有guid的内容。像这样:

Team = department.Teams
    .Where(t => a.Personnel.Roles
        .Where(r => r.Department == department && r.EndDate == null)
        .Select(x => x.DeptTeamGUID)
        .Contains(t.GUID)
    )
    .Select(x => x.Name)
    .FirstOrDefault();