我有以下课程
public class Category
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int? ParentID { get; set; }
public virtual IList<Category> Children { get; set; }
}
我使用Nhibernate将具有字段id,name和parent id的自引用外键关系的数据库表映射到此类(尽管它可能是orm并不重要的实体框架)。
鉴于任何类别,我需要一个方法/查询,给我类别parentid,grandparentid等。我认为这样做的一种方法是使用一种方法,递归提取连续的parentids并在它遇到null parentid时停止。到目前为止,我想出的最好的事情就是按照
的方式做点什么 newcategory = Load<Category>(category.parentId)
add newcategoryid to list
category = newcategory
repeat until category.parentid is null
但是我想知道这样的事情是否会出现性能问题,因为它可能涉及到数据库的多次访问。
答案 0 :(得分:2)
正如您所提到的,实体框架可能会遇到困难。您可以将所有内容加载到该表的内存中,然后使用LINQ来递归层次结构。
var categories = from c in category
select c;
//ToList executes the SQL statement once
var catList = categories.ToList()
//recurse over in-memory list
或者你可以创建一个SQL存储过程,只需用EF调用它。