我想知道在不首先将所有关系对象加载到内存中的情况下查询多对多关系的最佳方法。
例如,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 是我唯一的选择吗?
最佳答案
这是一种方法:
var visibleArticlesQuery = context.Category.Where(c => c.Id == category.Id)
.SelectMany(c => c.Articles)
.Where(a => a.IsVisible);
也可以查询 Article DbSet,例如,使用 Contains
。
关于entity-framework - Entity Framework 代码优先 : Querying many to many navigation properties without loading into memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13047868/