0

我正在寫一個asp.net mvc應用程序來學習實體框架,並且遇到了一個我不知道如何處理的問題。爲簡單起見讓我們如下表結構:實體框架 - 加入空值 - NullReferenceException被用戶代碼未處理

Movie 
ID (int, not null, auto increment) 
Name (varchar) 
GenreID (int) 

Genre 
ID (int, not null, auto increment) 
Name (varchar) 

Movie.GenreID是使用可視化一個FK參照Genre.ID

我已經在所有的表的帶來設計師在VS 2008,並嘗試以下Linq查詢:

IEnumerable<Movie> movieList = from f in dataContext.MovieSet.Include("Genre").ToList(); 

我可以輸出數據在視圖中使用:

<%= Html.Encode(movieList.Genre.Name) %> 

一切正常,直到我有一個空的GenreID電影表中的項目。有什麼我可以做這個查詢,使其仍然能夠輸出(只要在適用時留空)還是我做了一些可怕的錯誤?

回答

0

,這大概比.Include("")更可讀

from f in dataContext.MovieSet 
select new 
    { 
     Name = f.Name, 
     Genre = f.Genre // This effectively performs a join. 
     ... 
    } 

您還可以檢查問題的方法:

from f in dataContext.MovieSet 
select new 
    { 
     Name = f.Name, 
     GenreName = f.Genre == null ? "" : f.Genre.Name 
     ... 
    } 

這給你更多的靈活性,例如:

from f in dataContext.Genres 
select new 
    { 
     Name = f.Name 
     Movies = from movie in f.Movies 
       where movie.Duration > 240 
       select movied 
    } 
+0

這對我對Linq和EF都是新手很有幫助。有沒有辦法做一個像上面發佈的那樣的查詢,可以返回爲或可以轉換爲在將表格架構導入EF時創建的強類型類? – mynameiscoffey 2009-12-27 02:51:34

+0

迴應你的第二個例子,如果我要將「select new」部分改爲: select new f, Genre =(f.Genre == null)?新類型():f.Genre } 但我仍然遇到上述類型鑄造問題。 再次感謝您的回覆 - 我非常感謝您向我提供的以上示例。 – mynameiscoffey 2009-12-27 02:59:15

+0

你可以像這樣返回強類型的類。你唯一需要記住的是Linq不支持帶參數的構造函數。而是使用對象初始化器語法:'select new Movie {Name = f.Name,GenreName = f.Genre == null? 「」:g.Genre.Name};' – 2009-12-27 20:12:07

1

問題是movieList.Genre爲空,並且您無法訪問null對象的Name屬性。

您可以通過編寫<%= Html.Encode(movieList.Genre == null ? String.Empty : movieList.Genre.Name) %>來解決此問題。

如果您不希望您的視圖過於冗長,則可以將GenreName屬性添加到Movie實體類,並在其中移動空值​​檢查。

+0

有趣的是,它將對象留爲空(因此不允許其任何屬性被加密ssed)。我會假設它們的方法都是可以訪問的,而且沒有任何值。 (就像我已經輸入了「select m。*,g.Name作爲來自電影m的GenreName m離開g.ID = m.GenreID的類型g」一樣,並且返回了一個記錄集,我仍然可以調用GenreName並獲得空響應,不是一個連接沒有發生的例外) 這消除了錯誤,但我希望避免在視圖中進行任何類型的檢查。 – mynameiscoffey 2009-12-27 02:50:05

+0

我同意「movieList.Genre.Name」的語法非常冗長,但我可以想到我可能希望在將來能夠擁有這種能力的原因(顯然在這個例子中沒有真正的需要,更多的只是嘗試瞭解EF/Linq能夠做什麼)。我注意到,如果我打電話來得到我的查詢,如果我添加「if(movie.Genre == null)movie.Genre = new Genre();」在我返回電影對象之前,它的行爲與我所希望的完全相同。有沒有辦法繞過需要檢查每個屬性爲空? – mynameiscoffey 2009-12-27 02:55:43

相關問題