2014-10-09 38 views
0

的图我有这样的模型结构:实体框架6和显式装载对象

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

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

public class Comment 
{ 

} 

我想显式地加载“文章”和“评论”的集合。

不能(使用包括运营商),因为我加载的集合必须过滤之前加载到每个对象(因为它们可能包含的项目数量巨大)使用延迟加载,也没有预先加载。

任何意见,以实现这一目标的最佳方式?

谢谢!

Riana

回答

0

我发现的灵感和基于this Rowan Miller's presentation at TechEd 2014的解决方案。

我主要关心的是能够在加载博客聚合时过滤出“帖子”和“评论”集合(根据已知条件)。

延迟加载并不是一个很好的解决方案,因为它会以加载所有需要的信息及其相应的意见(帖子和评论作品集可以是巨大的)

我想预先加载了太多的查询发送到数据库,使用“包含”运算符不是一个好的解决方案,因为“包含”运算符不支持筛选。这意味着如果我加载我的博客是这样的:myContext.Blogs.Include(“帖子”),帖子集合没有被过滤,并且数据库中的所有帖子都会被加载,我不希望那样。

在EF6中,现在可以在将查询语句转换为SQL并发送到数据库之前拦截和修改查询。这个功能是关键的解决方案。

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

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

希望这有助于,

Riana