2012-09-04 189 views
0

我见过类似这个,但无法找到答案。我有2个enities出版物和作者。 作者不是强制性的,当我OrderBy Publication.Author.Surname我得到NullReferenceException,因为出版物dosnt总是有一个相关的作者。我如何编写这个简单的查询,以及为什么hent dosnt EhtityFramework知道如何处理这个问题?实体框架Orderby一对多实体

public class Publication { 
[Key] 
public int ID { get; set; } 

public string Title { get; set; } 

[Display(Name = "Author")] 
public int? AuthorId { get; set; } 
public virtual Author Author { get; set; } 
} 

public class Author{ 
[Key] 
public virtual int ID { get; set; } 

public virtual string Forename { get; set; } 

public virtual string Surname { get; set; } 
} 

this.db.Publications 
    .OrderBy(p=>p.Author.Surname) 
    .Skip(skip) 
    .Take(model.PageSize).ToList(); 

失败,因为出版物dosnt始终有相关的作者。注:db是实体框架的DbContext如下:

public class PPRDBContext : DbContext 
{ 
    public DbSet<Publication> Publications { get; set; } 
    public DbSet<Author> Authors { get; set; } 
} 
+0

什么类型db.Publications?如果它是IQueryable(例如IDbSet),EF会将表达式转换为SQL代码,即p.Author.Surname实际上并未执行,因此它不会引发异常。 EF将生成类似外连接的内容,而NULL作者将按其他值排序。我没有进一步修改就得到了这个工作。 – lgoncalves

+0

如果你得到这个异常,它可能是一个标志,它是一个IEnumerable而不是IQueryable,这意味着该序列是在内存中的。 – lgoncalves

+0

lgoncalves - 我添加了db(DBContext)代码来显示出版物的位置。所以Publications是一个DbSet,但它仍然抛出异常。 – gisWeeper

回答

3

这不是EF的错 - 这是用我知道访问引用对象的属性时,任何语言的一个共同陷阱。

根据您是否想NULL值先来,你可以这样做:如果你想NULL值,最后使用像来

.OrderBy(p=> p.Author == null ? "" : p.Author.Surname) 

.OrderBy(p=> p.Author == null ? "ZZZZZ" : p.Author.Surname) 
+0

这样做。谢谢D斯坦利 – gisWeeper

+0

这不应该需要 – lgoncalves

+0

是的,我不喜欢答案要么(抱歉D斯坦利) - 但它的作品。我宁愿将EF整理出来。我对EF很新,所以这可能是我正在做的事情。 – gisWeeper