2013-03-21 7 views
1

Я искал какое-то время и искал различные комбинации для моей проблемы.Анонимные типы LinQ - Проверить нулевое значение - Исключение

Я хочу заполнить свой Gridview результатами моего анонимного типа. Первый запуск в «цикле» идет хорошо, потому что все переменные имеют некоторое фактическое значение.

Но второй раз, чтобы заполнить ряд строк 2: Ссылка на объект не установлена ​​в экземпляр объекта.

Это потому, что я, вероятно, назначил анонимный объект null, а обработчик gridview не смог его обработать. Я попытался выработать некоторые решения, но пока ничего не вышло.

Есть ли секретный проход, чтобы понять LinQ правильно?

Это мой код прямо сейчас:

var filteredlist = from info in list // List from external 
        select new 
        { 
         Question = info.QuestionText ?? "Test", 
         CorrectAnswer = info.CorrectAnswer.OptionText ?? "Test", 
         WrongAnswer1 = info.WrongAnswer1.OptionText ?? "Test", 
         WrongAnswer2 = info.WrongAnswer2.OptionText ?? "Test", //Throws Error 
         WrongAnswer3 = info.WrongAnswer3.OptionText ?? "Test" //Throws Error 
        }; 

GridView1.DataSource = filteredlist; 
GridView1.DataBind(); 

Это мои попытки заставить его работать.

var filteredlist = from info in list // list from external 
        select new 
        { 
         Question = info.QuestionText == null ? "Test" : info.QuestionText, 
         CorrectAnswer = info.CorrectAnswer.OptionText == null ? "Test" : info.CorrectAnswer.OptionText, 
         WrongAnswer1 = info.WrongAnswer1.OptionText == null ? "Test" : info.WrongAnswer1.OptionText, 
         WrongAnswer2 = info.WrongAnswer2.OptionText == null ? "Test" : info.WrongAnswer2.OptionText, //Throws Error 
         WrongAnswer3 = info.WrongAnswer3.OptionText == null ? "Test" : info.WrongAnswer3.OptionText, //Throws Error 
        }; 


GridView1.DataSource = filteredlist; 
GridView1.DataBind(); 

Второй попробовать

var filteredlist = from info in list // list from external 
        select new 
        { 
         Question = info.QuestionText != null ? "Test" : info.QuestionText, 
         CorrectAnswer = info.CorrectAnswer.OptionText != null ? "Test" : info.CorrectAnswer.OptionText, 
         WrongAnswer1 = info.WrongAnswer1.OptionText != null ? "Test" : info.WrongAnswer1.OptionText, 
         WrongAnswer2 = info.WrongAnswer2.OptionText != null ? "Test" : info.WrongAnswer2.OptionText, //Throws Error 
         WrongAnswer3 = info.WrongAnswer3.OptionText != null ? "Test" : info.WrongAnswer3.OptionText, //Throws Error 
        }; 

GridView1.DataSource = filteredlist; 
GridView1.DataBind(); 
+1

Пожалуйста, обратите внимание на код форматирования в своем вопросе. Это имеет огромное значение для читаемости. –

ответ

4

Попробуйте проверить, если WrongAnswer s не нулевой, как так:

from info in list 
where info != null 
select new 
{ 
    Question = info.QuestionText ?? "Test", 
    CorrectAnswer = info.CorrectAnswer.OptionText ?? "Test", 
    WrongAnswer1 = info.WrongAnswer1 !=null ? info.WrongAnswer1.OptionText : "Test", 
    WrongAnswer2 = info.WrongAnswer2 !=null ? info.WrongAnswer2.OptionText : "Test", 
    WrongAnswer3 = info.WrongAnswer3 !=null ? info.WrongAnswer3.OptionText : "Test" 
}; 

Я люблю использовать общие методы для читаемости, например:

public string DefaultIfNull<TValue>(TValue value, Func<TValue, string> selector) where TValue : class 
{ 
    if(value != null) 
     return selector(value); 
    return "Test"; //you can make resut generic too 
} 

Теперь вы можете:

Func<Answer,string> optionTextSelector = answer => answer.OptionText; 

from info in list 
where info != null 
select new 
{ 
    Question = info.QuestionText ?? "Test", 
    CorrectAnswer = DefaultIfNull(info.CorrectAnswer, optionTextSelector), 
    WrongAnswer1 = DefaultIfNull(info.WrongAnswer1, optionTextSelector), 
    WrongAnswer2 = DefaultIfNull(info.WrongAnswer2, optionTextSelector), 
    WrongAnswer3 = DefaultIfNull(info.WrongAnswer3, optionTextSelector), 
}; 

Основная идея заключается не в запутывании и не в том, чтобы сделать ваше решение тоже комплекс с использованием функционального подхода.

+0

Это решило проблему. Я не думал об этом, «локальные» переменные «optiontext», где единственное, что показывало «null» Спасибо! Я ценю всю помощь! (от других). –

0

info.WrongAnswer2 скорее всего null. Попыться:

WrongAnswer2 = info.WrongAnswer2 == null ? "Nothing To See Here" : 
    info.WrongAnswer2.OptionText ?? "Test" 

Аналогичным образом с info.WrongAnswer3.

0

Возможно, вы проверяете неправильное свойство, попробуйте проверить info.WrongAnswer2 и info.WrongAnswer3 за нуль перед проверкой OptionText.

Смежные вопросы