实体框架选择导航ICollection为IQueryable

时间:2011-02-27 13:01:07

标签: asp.net asp.net-mvc entity-framework code-first

我刚开始使用EF Code First来实现一个简单的博客。

我有一个Post对象,它有一个产品变量

virtual Product Product { get; set; }

Product类有一组类别

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

最后,该类别有一个集合帖子。

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

到目前为止一直运作良好。现在我想获得特定类别的帖子。我最初在我的PostRepository中通过传递类别ID来执行此操作:例如

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>>

所以我的问题是如何从我的Category实体获得IQueryable?我确信答案很简单,但我一直在尝试各种组合无济于事。

1 个答案:

答案 0 :(得分:7)

你试过.SelectMany(p => p.Posts).AsQueryable()吗?