0

我正在使用 NHibernate,它是使用 Respositories 和服务抽象出来的。我们不允许延迟加载属性,因此必须在查询中选择它们。

我的问题是我正在尝试从 Answers 表中获取最新的响应号,但在许多情况下该对象可能不存在,因此我遇到了 Null Reference 异常或“代码应该无法访问”异常。

这是我对评论的适当部分所做的事情。.

var leaders = 
    _storeService.GetAll()
                 .Where( p => p.Id.Equals(storeId) && p.Employees.Any() )
                 .SelectMany(p => p.Employees)
                 .Select(emp => new
                  {
                      LeaderId = emp.Id,
                      LeaderFirstName = emp.FirstName,
                      LeaderLastName = emp.LastName,
                      Followers = emp.Followers
                                     .Select(followers => new

{
    followers.FollowerEmployee.Id,
    followers.FollowerEmployee.FirstName,                    
    followers.FollowerEmployee.LastName,
    DepartmentName = followers.FollowerEmployee.Department.Name,

    //Problem Area
    AssessmentResponse = followers.FollowerEmployee
                                  .Answers
                                  .First( a => a.Answer.Question.IsPrimary )
                                  .Answer
                                  .Number
                                  //Null Reference Exception                                        
} )

} ).ToList();

我可能已经尝试了 15 次迭代,并不总是使用 .First 但有时使用 .Single

我无权访问存储库模式或任何 NHibernate 查询。有没有办法用 LINQ 避免这个空引用异常?我不能延迟加载,所以这有点问题。

4

2 回答 2

2

在 EF/Linq-2-Sql 中,这可以通过强制转换为可为空的值来实现,因为底层 SQL 会进行空合并:

AssessmentResponse = (int?)followers.FollowerEmployee.Answers
    .First(a => a.Answer.Question.IsPrimary).Answer.Number

我不确定 NHibernate 中的行为是什么,但值得一试。如果 Number 属性已经可以为空,您可以尝试合并它:

AssessmentResponse = (int?)followers.FollowerEmployee.Answers
    .First(a => a.Answer.Question.IsPrimary).Answer.Number ?? some default value

最后,你总是可以做一个明确的检查:

AssessmentResponse = followers.FollowerEmployee.Answers.Any(a => a.Answer.Question.IsPrimary)
    ? followers.FollowerEmployee.Answers.First(a => a.Answer.Question.IsPrimary).Answer.Number ?? some default value
     : null
于 2013-06-30T20:17:46.863 回答
0

而不是这个:

AssessmentResponse = followers.FollowerEmployee
                              .Answers
                              .First( a => a.Answer.Question.IsPrimary )
                              .Answer
                              .Number
                              //Null Reference Exception 

尝试这个:

AssessmentResponse = followers.FollowerEmployee
                              .Where(a=>a.Answers != null && a.Answers
                                                              .Where(a=>a.Answer.Question.IsPrimary)
                                                              .Count > 0)
                              .Answers
                              .FirstOrDefault( a => a.Answer.Question.IsPrimary )
                              .Answer
                              .Number
                              //Null Reference Exception 
于 2013-06-30T22:43:50.493 回答