2012-09-04 190 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