0

リポジトリとサービスを使用して抽象化された NHibernate を使用しています。プロパティの遅延読み込みは許可されていないため、クエリで選択する必要があります。

私の問題は、Answers テーブルから最新の応答番号を取得しようとしていることですが、多くの場合、オブジェクトが存在しない可能性があるため、Null 参照例外または「コードに到達できない」例外が発生することで立ち往生しています。

これが、コメントされた適切なセクションで私がしていることです。.

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 でこの null 参照例外を回避する方法はありますか? 遅延ロードできないので、ちょっと問題です。

4

2 に答える 2

2

EF/Linq-2-Sql では、基になる SQL が null 合体を行うため、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
于 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 に答える