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来避免这种空引用异常?我不能懒加载,所以这有点问题。
在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