C# LINQ Lambda仅在存在时选择
我使用的是NHibernate,它是通过职责和服务抽象出来的。我们不允许延迟加载属性,因此必须在查询中选择它们 我的问题是,我试图从Answers表中获取最新的响应号,但在许多情况下,该对象可能不存在,因此我只能获取Null引用异常,或者“代码应该是不可访问的”异常 下面是我对评论的适当部分所做的。 我可能已经尝试了15次迭代,但并不总是使用。第一次,但有时。单次C# LINQ Lambda仅在存在时选择,c#,linq,nhibernate,lambda,C#,Linq,Nhibernate,Lambda,我使用的是NHibernate,它是通过职责和服务抽象出来的。我们不允许延迟加载属性,因此必须在查询中选择它们 我的问题是,我试图从Answers表中获取最新的响应号,但在许多情况下,该对象可能不存在,因此我只能获取Null引用异常,或者“代码应该是不可访问的”异常 下面是我对评论的适当部分所做的。 我可能已经尝试了15次迭代,但并不总是使用。第一次,但有时。单次 我没有访问存储库模式或任何NHibernate查询的权限。有没有办法用LINQ避免这种空引用异常?我不能延迟加载,所以这有点问题。
我没有访问存储库模式或任何NHibernate查询的权限。有没有办法用LINQ避免这种空引用异常?我不能延迟加载,所以这有点问题。在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
与此相反:
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
也许是FirstOrDefault?我试过FirstOrDefault,SingleOrDefault,Single,First,Take(1)。。。空引用异常或“代码应不可访问”。此处的缩进使其非常难以读取…空引用来自尝试获取应答的Number属性?在计数大于1的情况下,是否可以执行一次计算?哪个属性为您提供了
NullReferenceException
?
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