Asp.net mvc 如何限制Asp.net mvc控制器中的嵌套导航属性

Asp.net mvc 如何限制Asp.net mvc控制器中的嵌套导航属性,asp.net-mvc,entity-framework,navigation-properties,nested-query,Asp.net Mvc,Entity Framework,Navigation Properties,Nested Query,我使用实体框架从数据库中获取一条记录。它具有嵌套的导航属性 public partial class Comment { public Comment() { this.Comments1 = new HashSet<Comment>(); } public int CommentId { get; set; } public Nullable<int> ParentId { get; set; } p

我使用实体框架从数据库中获取一条记录。它具有嵌套的导航属性

  public partial class Comment
{
    public Comment()
    {
        this.Comments1 = new HashSet<Comment>();
    }

    public int CommentId { get; set; }
    public Nullable<int> ParentId { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Comment> Comments1 { get; set; }
    public virtual Comment Comment1 { get; set; }
}
公共部分类注释
{
公众评论()
{
this.Comments1=新的HashSet();
}
public int CommentId{get;set;}
公共可为空的ParentId{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection注释1{get;set;}
公共虚拟注释Comment1{get;set;}
}
Id和父Id之间的关系。我的导航是Comments1。
现在,我选择一个具有5个嵌套导航的记录。我只想在控制器中使用C#代码限制3个嵌套导航。如何创建递归方法并将嵌套导航限制为3级?

不幸的是,EF中不存在该功能。您可以做的是禁用延迟加载:

public class YourContext : DbContext 
{ 
    public YourContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}
然后使用
Include
扩展方法作为查询的一部分来加载所需的级别:

var query=context.Comments.Include(c=>Comments1.Select(c1=>c1.Comments1))...;
我认为另一种解决方案可能是使用自动映射,如果我的想法没有让我失望,我认为您可以使用自参考属性中的
MaxDepth
方法来指定要加载的级别:

 configuration.CreateMap<Comment, CommentViewModel>()
              .ForMember(dest => dest.Comments, opt => opt.MapFrom(src => src.Comments1).MaxDepth(3)...; 
configuration.CreateMap()
.FormMember(dest=>dest.Comments,opt=>opt.MapFrom(src=>src.Comments1).MaxDepth(3)。。。;