LINQ Lambda仅在存在时选择

本文关键字:选择 存在 Lambda LINQ | 更新日期: 2023-09-27 18:20:25

我正在使用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次迭代,并不总是使用。首先,但有时。单个

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

LINQ Lambda仅在存在时选择

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

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

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

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

而不是这个:

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