2011-11-19 32 views
1

無論我如何翻轉此腳本,它仍然給我Object reference not set to an instance of an object.消息,當我調試(程序運行良好,如果我不調試,但每次我調試我得到這個消息,這是爲什麼?)PagesIndex - 對象引用未設置爲對象的實例

public string GetTemplate(int pageId) 
{ 
    string template = ""; 

    PagesIndex qq = new PagesIndex(); 
    qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault(); 

    if (qq.Template == null) //Here on qq.Template - Object reference not set to an instance of an object. 
    { 
     template = "_Layout"; 
    } 
    else 
    { 
     template = qq.Template; 
    } 
    return template; 
} 

希望可以改變我的心情:)

回答

4

大概qq從LINQ導致爲空。
試試這個

public string GetTemplate(int pageId) 
{ 
    string template = ""; 
    PagesIndex qq = new PagesIndex(); 
    qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault(); 

    if (qq == null || qq.Template == null) 
     template = "_Layout"; 
    } 
    else 
    { 
     template = qq.Template; 
    } 
    return template; 
} 

或短:

public string GetTemplate(int pageId) 
{ 
    PagesIndex qq = db.PagesIndexes 
         .Where(p => p.Id == pageId) 
         .SingleOrDefault(); 
    return qq == null || qq.Template == null ? 
      "_Layout" : 
      qq.Template; 
} 
+0

哦,那就是爲什麼!它是完全有道理的!爲什麼diddnt我看到了。想!謝謝:) – BjarkeCK

+0

在這裏學到了很多,謝謝:) – BjarkeCK

+0

@BjarkeCK:不客氣:) – Marco

3

,讓錯誤只能拋出NullReferenceException如果qq是null線。如果行之前沒有找到該行,就會發生這種情況。我想你認爲qq永遠不能爲空,因爲你爲它分配了一個非空值。但是,如果未找到該行,則此行將用空值覆蓋此值。

PagesIndex qq = new PagesIndex(); // Pointless and misleading assignment! 
qq = (from cc in db.PagesIndexes where cc.Id == pageId select cc).SingleOrDefault(); 

你可以像這樣做,而不是使用null-coalescing operator

public string GetTemplate(int pageId) 
{ 
    return db.PagesIndexes 
      .Where(p => p.Id == pageId) 
      .Select(p => p.Template) 
      .SingleOrDefault() ?? "_Layout"; 
} 
+0

不要退出明白:(issnt PagesIndex QQ =新PagesIndex();我的對象 – BjarkeCK

+0

@BjarkeCK:是的,但對下一行使用'QQ =(從cc重新分配它...' – Marco

+0

@BjarkeCK:你的對象來自'Single'的調用,它是從數據庫中的數據創建的 –

0

這裏是我的懷疑。當您調試時,您正在使用PagesIndexes表中沒有任何數據(或任何匹配數據)的數據庫實例。這意味着qq將作爲查詢的結果(SingleOrDefault的默認部分)爲空。您可以通過檢查連接字符串來確認這一點,以確保它與您期望的數據庫相違背,並檢查該數據庫以確保它具有您希望存在的數據。在使用它之前,您還應該檢查qq是否爲空。

if (qq == null || qq.Template == null) 
{ 
    ... 
0

您可能正在捕捉代碼中某處的異常,這就是爲什麼您沒有看到它。你的LINQ語句沒有返回結果。檢查QQ爲空而不是qq.Templates。

if(qq != null) { if (qq.Templates != null)... }

相關問題