如何从底层开始循环,获取最高级别的内容

wsbgy 2010-09-26 12:05:44
现有一产品表,表中字段为:
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;
}
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zming 2010-09-26
  • 打赏
  • 举报
回复
不建议使用递归不是不允许使用递归。

递归是有副作用的,比如说:
递归过深,将会造成栈溢出异常(StackOverflowException)
某些新手在使用递归时,没有正确地判断递归的返回条件造成应用程序崩溃。
递归的运行效率很低。

所以,能使用其它方法替代的时候就尽量避免使用递归。

wsbgy 2010-09-26
  • 打赏
  • 举报
回复
如果不用递归的话,那该如何写呢?
zming 2010-09-26
  • 打赏
  • 举报
回复
递归方法没写对,


/// <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;
}



一般不建议使用递归
种草德鲁伊 2010-09-26
  • 打赏
  • 举报
回复
有个现成的楼主也许可以参考一下


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;
}
种草德鲁伊 2010-09-26
  • 打赏
  • 举报
回复
把if改成while
ailin84 2010-09-26
  • 打赏
  • 举报
回复
层次结构一般不使用递归,总会有比递归更有效的办法

你可以在类别表中加一个字段 比如 sortPath 用id字符串来表示当前的层次路径

如:
title sortid parentid sortpath
公司 1 0 0,1,
技术部 2 1 0,1,2
项目组 3 2 0,1,2,3
llovecf 2010-09-26
  • 打赏
  • 举报
回复
不知道楼主有没有试过改变数据结构 比如给同一大分类加一个标识 这样的话 你要哪个分类的最高级内容就变成了只有一条SQL语句了 当然 貌似扩展性不强 毕竟也只能解决这一个问题 会不会得不偿失呢
另外 我之前一直就是用while循环做 如5楼说 递归确实是把双刃剑 while的话 写不好也容易死 呵呵 坐等高人出现

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧