实体框架代码优先:查询多个导航属性而不加载到内存中

时间:2012-10-24 11:00:15

标签: entity-framework ef-code-first entity-framework-4.3

我想知道查询多对多关系的最佳方法,而无需先将所有关系对象加载到内存中。

例如,Category和Article有很多关系。这意味着我的Category类具有(延迟加载的)导航属性,如下所示:

class Category
{
     public long Id {get; set;}
     public ICollection<Articles> Articles {get; set;}
}

如果我只想选择可见的文章,我可以像这样查询导航属性:

category.Articles.Where(a => a.IsVisible)

但据我所知,这会在进行IsVisible检查之前将所有相关文章加载到内存中。

是否有可能查询相关文章而不将其加载到内存中,即作用于IQueryable而不是ICollection?如果这是一对多关系,那么我可以直接查询文章DbSet以实现我所追求的但是多对多的关系存储在sql的链接表中,这意味着我无法使用DbSet查询它。我是唯一一个手动编写原始sql来查询链接表的选项吗?

1 个答案:

答案 0 :(得分:6)

这是一种方式:

var visibleArticlesQuery = context.Category.Where(c => c.Id == category.Id)
                                           .SelectMany(c => c.Articles)
                                           .Where(a => a.IsVisible);

例如,也可以使用Contains查询文章DbSet。