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?如果这是一对多关系,那么我可以直接查询 Article DbSet 以实现我所追求的目标,但是多对多关系存储在 sql 的链接表中,这意味着我无法使用 DbSet 来查询它。我唯一的选择是手动编写将查询链接表的原始 sql 吗?

4

1 回答 1

6

这是一种方法:

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

例如,也可以使用 查询 Article DbSet Contains

于 2012-10-24T14:43:10.157 回答