我想知道查询多对多关系的最佳方法,而无需先将所有关系对象加载到内存中。
例如,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来查询链接表的选项吗?
答案 0 :(得分:6)
这是一种方式:
var visibleArticlesQuery = context.Category.Where(c => c.Id == category.Id)
.SelectMany(c => c.Articles)
.Where(a => a.IsVisible);
例如,也可以使用Contains
查询文章DbSet。