2011-09-12 96 views
1

是否有可能控制子對象的急切加載。實體框架4.1代碼優先 - 控制渴望加載

如果我有一個擁有20,000個子對象的父類,並且我只想檢索這些子對象的子集,有可能嗎?

我該如何編寫查詢來做到這一點?

例如:

我有一個實體,稱爲書裏面有許多相關的評論:

public class Book { 
    public int BookId { get; set; } 
    public string BookName { get; set; } 
    public ICollection<Review> Reviews { get; set; } 
} 

public class Review { 
    public int ReviewId { get; set; } 
    public int Score { get; set; } 
    public Book Book { get; set; } 
} 

我想要做的事,如:

var bookWithFirstTwentyReviews = db.Books.Where(b => b.BookId == 1).Include("Reviews").FirstOrDefault(); 

但我只想要包括20條評論,並非全部爲20,000

+0

你是指選擇性加載子集合的一個子集或完全獨立的子對象? – BrokenGlass

+0

更新我的帖子以顯示我想要的內容。 – Dismissile

+0

@BrokenGlass:你爲什麼刪除你的答案?我很確定這是一種工作方式。 – Slauma

回答

3

Include不允許任何f過濾或分類。一種選擇是使用explicite加載:

// load book without Reviews (1st roundtrip to DB) 
var book = context.Books.Where(b => b.Id == id).SingleOrDefault(); 

// then load a filtered collection of Reviews (2nd roundtrip to DB) 
if (book != null) 
    context.Entry(book).Collection(b => b.Reviews).Query().Take(20).Load(); 

它需要兩個往返到數據庫中,但(這不一定是壞事,performancewise,因爲另一方面預先加載帶有潛在lots of duplicated data)。

另一種方法是在上下文中使用投影和槓桿關係跨度。這是@BrokenGlass顯示的解決方案(現在刪除)。