Entity Framework 4.1, код первый - контроль за активной загрузкой - PullRequest
1 голос
/ 12 сентября 2011

Можно ли контролировать энергичную загрузку дочерних объектов.

Если у меня был родительский класс, имеющий 20 000 дочерних объектов, и я хотел получить только подмножество этих дочерних объектов, возможно ли это?

Как мне написать запрос, чтобы сделать это, если он есть?

Например:

У меня есть объект под названием Book, у которого есть несколько связанных отзывов:

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

1 Ответ

3 голосов
/ 13 сентября 2011

Include не разрешает какую-либо фильтрацию или сортировку. Один из вариантов - использовать явную загрузку:

// 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();

Это требует двух циклических обращений к базе данных (что не обязательно плохо, с точки зрения производительности, потому что активная загрузка с другой стороны сопровождается потенциально большим количеством дублированных данных ).

Другой подход состоит в том, чтобы использовать в контексте взаимосвязь проекции и рычагов. Это было решение, показанное @BrokenGlass (удалено сейчас).

...