2010-04-26 63 views
1

這是一個奇怪的,我無法弄清楚。生成SelectListItems的Linq錯誤

我的方法有一個paramemer一個可空INT

詮釋? selectedtitleid

這是Linq的代碼:

var titles = from t in dc.Titles 
      select new SelectListItem 
      { 
       Text = t.Title1, 
       Value = t.TitleID.ToString(), 
       Selected = (t.TitleID == selectedtitleid) 
      }; 

return titles.ToList(); // Error gets thrown here 

它正常工作時selectedtitleid不爲空 - 但拋出一個異常時,它是空的。

例外情況是: 無法將null值分配給類型爲System.Boolean的非空值類型的成員。

我做了一個測試,是這樣的

int? t1 = null; 
bool b1 = (t1 == null); 

和B1被設置爲false - 那麼,爲什麼沒有出現這種情況在LINQ查詢?

這可能是簡單的 - 任何人有任何想法?

乾杯

回答

1

OK,你所提供的LINQ查詢將轉移到SQL語法,如:

SELECT 
    [t0].[Title1], 
    [t0].[TitleID], 
    (CASE 
     WHEN [t0].[TitleID] = @p1 THEN 1 
     WHEN NOT ([t0].[TitleID] = @p1) THEN 0 
     ELSE NULL 
    END) AS [Value] 
FROM [dbo].[Titles] AS [t0] 

其中@p1實際上是你selectedtitleid變量。

現在想象一下selectedtitleid = null。這意味着也不會滿足第一個條件,而不是CASE區塊中的第二個條件。這是因爲SQLnull中的空值不等於任何其他值,即使是null)。所以當selectedtitleid值爲null,null值將爲[Value]字段將被返回。這就是爲什麼你會得到你的例外。

的解決方法是更改​​代碼:

var titles = from t in dc.Titles 
      select new SelectListItem 
      { 
       Text = t.Title1, 
       Value = t.TitleID.ToString(), 
       Selected = ((t.TitleID ?? 0) == (selectedtitleid ?? 0)) 
      }; 

這意味着null insted的會有比較整數。所以如果t.TitleIDnullselectedtitleidnullSelected將被設置爲真。

+0

唉唉好人 - 這是完美的:) 其實我想這樣做(t.TitleID == selectedtitleid)?錯誤 - 但因爲它將其更改爲SQL它不起作用:) 乾杯亞歷克斯 – Eoinii 2010-04-26 16:07:59

0

我剛剛遇到同樣的問題,當選定的值是一個字符串,這是一個例外,因爲通常你會有某種int或GUID作爲選定的值。我的解決方法是添加一個檢查string.IsNullOrEmpty。

var x = from cp in db.CompanyPrefix 
     orderby cp.CompanyPrefixName 
     select new SelectListItem 
        { 
         Text = cp.CompanyPrefixName, 
         Value = cp.CompanyPrefixName, 
         Selected = (uti != null && !string.IsNullOrEmpty(uti.CompanyPrefix) && uti.CompanyPrefix == cp.CompanyPrefixName) 
        };