我目前正在使用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
有人能引导我朝正确的方向前进吗?
答案 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();