我有这样的模型结构:
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通过实现软删除来演示此功能。
希望能帮上忙,
里亚纳