现有一产品表,表中字段为:
ProductID   CategoriesID
产品ID         类别ID另有一个产品类别表:
CategoriesID   ParentID
类别ID         父级类别ID我现在需要获取最顶层的类别ID,如何获取?
最顶层的类别的ParentID为0我是这样写的,但获得结果不对!    /// <summary>
    /// 根据产品ID获取其所属的顶层产品类目ID
    /// </summary>
    /// <param name="ProductID">产品ID</param>
    /// <returns></returns>
    private int GetTopCategoriesIDByProductID(int ProductID)
    {
        M_Products model = BLLFactory.CreateProductBLL().GetDetail(ProductID);
        return GetTopCategoriesID(model.CategoriesID);
    }    /// <summary>
    /// 获取顶层产品类目ID
    /// </summary>
    /// <param name="iChildCategoriesID"></param>
    /// <returns></returns>
    private int GetTopCategoriesID(int iTopCategoriesID)
    {
        M_Categories model = BLLFactory.CreateCategoriesBLL().GetDetail(iTopCategoriesID);        int iCategoriesID = 0;        if (model.ParentID == 0)
            iCategoriesID = model.CategoriesID;
        else
            GetTopCategoriesID(model.ParentID);        return iCategoriesID;
    }

解决方案 »

  1.   

    有个现成的楼主也许可以参考一下
            public static IEnumerable<ICategoryInfo> GetNavigation(IEnumerable<ICategoryInfo> categories, int categoryId)
            {
                IList<ICategoryInfo> list = new List<ICategoryInfo>();
                int loop = 0;
                int currentId = categoryId;            ICategoryInfo category;            while (loop < 10)
                {
                    loop++;
                    var tmp = categories.Where(c => c.CategoryId == currentId);                if (tmp.Count() < 1)
                    {
                        break;
                    }
                    else
                    {
                        category = tmp.First();
                        list.Add(category);                    if (category.ParentId > 0)
                        {
                            currentId = category.ParentId;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                return list.Reverse();
            }        public static IEnumerable<T> GetNavigation<T>(IEnumerable<T> categories, int categoryId)
            {
                if (typeof(T).GetInterfaces().Contains(typeof(ICategoryInfo)))
                {
                    var list = categories.Cast<ICategoryInfo>();
                    return GetNavigation(list, categoryId).Cast<T>();
                }
                return null;
            }
      

  2.   

    递归方法没写对,
        /// <summary>
        /// 获取顶层产品类目ID
        /// </summary>
        /// <param name="iChildCategoriesID"></param>
        /// <returns></returns>
        private int GetTopCategoriesID(int iTopCategoriesID)
        {
            M_Categories model = BLLFactory.CreateCategoriesBLL().GetDetail(iTopCategoriesID);        int iCategoriesID = 0;        if (model.ParentID == 0)
                iCategoriesID = model.CategoriesID;
            else
                iCategoriesID = GetTopCategoriesID(model.ParentID);  // <-- 错在这里,返回值被丢弃了        return iCategoriesID;
        }一般不建议使用递归
      

  3.   

    不建议使用递归不是不允许使用递归。递归是有副作用的,比如说:
        递归过深,将会造成栈溢出异常(StackOverflowException)
        某些新手在使用递归时,没有正确地判断递归的返回条件造成应用程序崩溃。
        递归的运行效率很低。所以,能使用其它方法替代的时候就尽量避免使用递归。
      

  4.   

    不知道楼主有没有试过改变数据结构 比如给同一大分类加一个标识 这样的话 你要哪个分类的最高级内容就变成了只有一条SQL语句了 当然 貌似扩展性不强 毕竟也只能解决这一个问题 会不会得不偿失呢 
    另外 我之前一直就是用while循环做 如5楼说 递归确实是把双刃剑 while的话 写不好也容易死 呵呵 坐等高人出现
      

  5.   

    层次结构一般不使用递归,总会有比递归更有效的办法你可以在类别表中加一个字段 比如 sortPath 用id字符串来表示当前的层次路径如:
    title sortid parentid sortpath     
    公司      1      0       0,1,           
    技术部    2      1       0,1,2          
    项目组    3      2       0,1,2,3