2011-09-12 17 views
1

子オブジェクトのeager読み込みを制御することは可能ですか?Entity Framework 4.1コードファースト - Eager読み込みを制御する

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フィルタリングまたはソート。 1つのオプションは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(); 

(一方、積極的なロードは、潜在的にlots of duplicated dataが付属しているので、performancewise、必ずしも悪いわけではないもの)それはしかし、データベースへの2回の往復が必要です。

もう1つの方法は、コンテキストで投影とレバレッジの関係を使用することです。これは@BrokenGlassで示された解決策でした(今削除されました)。

関連する問題