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



我有这样的模型结构:

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

我想显式加载"帖子"one_answers"评论"集合。

不能使用延迟加载或热切加载(使用Include运算符),因为我加载的集合在加载到每个对象之前必须进行筛选(因为它们可能包含大量项目)。

关于实现这一目标的最佳方式,有什么建议吗?

谢谢!

里亚纳

我找到了一个受启发的解决方案,该解决方案基于Rowan Miller在TechEd 2014上的演讲。

我主要关心的是,当我加载博客聚合时,能够过滤掉"帖子"one_answers"评论"集合(根据已知条件)。

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

我认为使用"Include"运算符的Eager加载不是一个好的解决方案,因为"Include"运算符不支持筛选器。这意味着,如果我像这样加载我的博客:myContext.blogs.Include("Posts"),帖子集合不会被过滤,数据库中的所有帖子都会被加载,我不希望这样。

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

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

RowanMiller通过实现软删除来演示此功能。

希望能帮上忙,

里亚纳

最新更新