MappingCategoryParentIDSelf-ReferencingTableStructuretoEFCoreEntityDatabaseTable:图片我试过这种方法将类别表映射到EFcore:protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){modelBuilder.Entity(entity=>{entity.HasMany(e=>e.Children).WithOne(e=>e.Parent).HasForeignKey(e=>e.ParentId);});}实体:[Table("Category"]publicclassCategory:EntityBase{[DataType(DataType.Text),MaxLength(50)]publicstringName{get;set;}publicint?ParentId{get;set;}}[ForeignKey("ParentId")]publicvirtualCategoryParent{get;set;}publicvirtualICollectionChildren{get;set;}}然后在存储库中:publicoverrideIEnumerableGetAll(){IEnumerablecategories=Table.Where(x=>x.Parent==null).Include(x=>x.Children).ThenInclude(x=>x.Children);returncategories;}无论你在哪里调用Include()或者调用了多少次ThenInclude(),3层之后什么都没有可以退货。我最终自己编写代码以使用递归函数填充子类别:类别=遍历(类别);返回类别;}privateIEnumerableTraverse(IEnumerablecategories){foreach(varcategoryincategories){varsubCategories=Table.Where(x=>x.ParentId==category.Id).ToList();category.Children=子类别;类别.Children=Traverse(category.Children).ToList();}返回类别;有谁知道编写存储过程以获取表层次结构并映射到我在示例中提供的类别实体的更好方法吗?由于缺乏递归表达式/CTE支持,EF(和一般的LINQ)在加载树状数据时遇到问题。但是如果你想加载整棵树(而不是过滤树枝),有一个简单的基于包含的解决方案。您只需要一个Include,然后EF导航属性修复将为您完成这项工作。当您需要获取示例中的根节点时,技巧是在通过切换到LINQtoObjects上下文(通常使用AsEnumerable())实现查询(并修复导航属性)后应用过滤器。因此,下面应该用单个SQL查询就可以生成想要的结果:以上是C#学习教程:将类别父ID自引用表结构映射到EFCore实体所有内容分享,如果对大家有用需要了解关于C#的更多信息我希望您能更多地关注教程—publicoverrideIEnumerableGetAll(){returnTable.Include(x=>x.Children).AsEnumerable().Where(x=>x.Parent==null).ToList();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
