2013-03-21 62 views
1

我已經搜索了一段時間,並嘗試了各種類型的組合,爲我的問題。匿名類型LinQ - 檢查空值 - 異常

我想用我的匿名類型的結果填充我的Gridview。 「循環」中的第一次運行順利,因爲所有變量都有一些實際值。

但是第二次填充行號2拋出:未將對象引用設置爲對象的實例。

這是因爲我可能分配一個匿名對象爲null和GridView不能處理它。 我試着找出一些解決方案,但還沒有解決。

有沒有一個祕密通道來正確理解LinQ?

這是我的代碼現在:

​​

這是我試圖得到它的工作。

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

請在您的問題中格式化代碼時多加註意。它對可讀性有很大的影響。 – 2013-03-21 11:33:22

回答

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」 謝謝!我感謝所有的幫助!(從其他人那裏)。 – 2013-03-21 11:42:05

0

info.WrongAnswer2是最有可能null。嘗試:

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

同樣。

0

您可能正在檢查錯誤的屬性,請在檢查OptionText之前嘗試檢查info.WrongAnswer2info.WrongAnswer3爲空。