2013-06-30 5 views
0

Я использую NHibernate, который абстрагируется, используя репозитории и сервисы. Нам не разрешено использовать свойства Lazy Load, поэтому они должны быть выбраны в запросе.LINQ Lambda выбрать только если существует

Моя проблема заключается в том, что я пытаюсь получить самый последний номер ответа из таблицы «Ответы», но во многих случаях объект может не существовать, поэтому я застрял в получении исключений 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? Я не могу лениться, так что это немного проблема.

+0

FirstOrDefault может быть? – jfin3204

+0

Я пробовал FirstOrDefault, SingleOrDefault, Single, First, Take (1) ... Исключение Null Reference или «Код должен быть недоступен». –

+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 
0

Вместо этого:

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

Try это:

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