Entity Framework Выберите навигационную коллекцию ICollection как IQueryable - PullRequest
1 голос
/ 27 февраля 2011

Я только начал использовать EF Code First для реализации простого блога.

У меня есть объект Post, у которого есть переменная продукта

virtual Product Product { get; set; }

Класс Product имеет коллекцию категорий

virtual ICollection<Category> Categories { get; set; }

Наконец-то у категории есть коллекция сообщений.

virtual ICollection<Post> Posts { get; set; }

Пока это хорошо работает. Теперь я хочу получать сообщения для определенной категории. Первоначально я делал это в своем PostRepository, передавая идентификатор категории: например,

public IQueryable<Post> GetPosts(int catId) {
    var q = _db.Posts.Select(p => p).Distinct();
    if (catId > 0)
        q = q.Where(p => p.Product.Categories.Any(c => c.ID == catId));
}

Это прекрасно работает, однако я также использую CategoryRepository, чтобы получить мою категорию. Поскольку в категории есть список продуктов, который, в свою очередь, содержит список сообщений, я подумал, что было бы лучше просто использовать это и удалить категорию из моего PostRepository.

Однако я столкнулся с проблемой. Чтобы получить сообщения, я использую это в моем контроллере:

model.Category = _cr.GetCategory(catId);
model.Posts =
    new PaginatedList<Post>(model.Category.Products.Select(p => p.Posts)
               .AsQueryable(), pageNumber, _defaultPageSize);

PaginatedList от NerdDinner принимает IQueryable. Теперь это ошибки, потому что я передаю в

IQueryable<ICollection<Post>>

Итак, мой вопрос: как я могу получить IQueryable из моей категории? Я уверен, что ответ прост, но я пробовал все виды комбинаций безрезультатно.

1 Ответ

7 голосов
/ 27 февраля 2011

Вы пробовали .SelectMany(p => p.Posts).AsQueryable()?

...