实体框架6并显式加载对象图

时间:2014-10-09 20:14:49

标签: frameworks linq-to-entities entity loading

我有这个模型结构:

public class Blog
{
    public ICollection<Post> Posts { get; set; }
}

public class Post
{
    public ICollection<Comment> Comments { get; set; }
}

public class Comment
{

}

我想明确加载&#34;帖子&#34;和#34;评论&#34;集合。

无法使用延迟加载或急切加载(使用Include运算符),因为我加载的集合必须在加载到每个对象之前进行过滤(因为它们可能包含巨大的物品数量)。

有关实现这一目标的最佳方式的任何建议吗?

谢谢!

Riana

1 个答案:

答案 0 :(得分:0)

我找到了一个受到启发并基于this Rowan Miller's presentation at TechEd 2014的解决方案。

我主要担心的是能够过滤掉#34;帖子&#34;和#34;评论&#34;我加载Blog聚合时的集合(根据已知条件)。

延迟加载不是一个好的解决方案,因为它会向数据库发送太多查询以加载所有需要的帖子及其相应的评论(帖子和评论集合可能很大)

我认为Eager正在加载,使用&#34; Include&#34;运营商,并不是一个好的解决方案,因为&#34;包括&#34;操作员不支持过滤器。这意味着,如果我加载我的博客: myContext.Blogs.Include(&#34;帖子&#34;),不会过滤帖子集合,并且会加载数据库中的所有帖子,我不想要那个。

在EF6中,现在可以在查询被解释为SQL并发送到数据库之前拦截和修改查询。此功能是关键解决方案。

我的解决方案是拦截Post和Comment对象上的所有SELECT查询,并修改它们以应用我的过滤器。通过这个实现,我可以进行急切加载,但Post和Comment对象上的所有SELECT查询仍然会自动应用过滤器。

Rowan Miller通过实施软删除来演示此功能。

希望得到这个帮助,

Riana