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

相关问题