我有这样的类别,这个类别有无限的子类别。 在数据库表中,字段是ID,UpperID和标题。
如果我在程序中使用递归方法调用DataTable中的类别及其子类别(ASP.NET项目) 表现非常糟糕。 许多用户将使用此应用程序,所以一切都很糟糕。 也许所有类别填充到Cache对象然后我们去了数据库。 但类别计数是15000或20000。 所以我觉得这不是一个好方法。
我可以为快速表现做些什么? 你有什么建议吗?
答案 0 :(得分:1)
caching
或其他内存持久性远远优于在关系系统上执行此操作:) ...嘿......它是oop!
只是我的2美分!
例如
var categories = /* method for domain-objects*/.ToDictionary(category => category.ID);
foreach (var category in categories.Values)
{
if (!category.ParentCategoryID.HasValue)
{
continue;
}
Category parentCategory;
if (categories.TryGetValue(category.ParentCategoryID.Value, out parentCategory))
{
parentCategory.AddSubCategory(category);
}
}
瞧......你的树准备好了!
修改强>
你确切地知道你的表现瓶颈在哪里?...
给你一些想法,例如:
从数据库加载:
然后你应该加载一次并确保有一些改变跟踪/通知以获得更改(如果做出)或优化你的查询!
建立结构:
我创建树的方式(遍历部分)是你用Dictionary<TKey, TValue>
查询结构:
我在我的例子中使用的结构比List<T>
快。 Dictionary<TKey, TValue>
使用键上的索引 - 因此您可以使用int
作为键(ID)
修改强>
你现在有什么?你从哪里开始?你能确定你的泥坑在哪里吗?给我们代码!所以你使用DataTable来修复 问题。现在你有两个问题:我 和DataTable
答案 1 :(得分:1)
全部谢谢,
我找到了使用公用表格表达式(CTE)的解决方案五十五。 它允许快速递归查询。
WITH CatCTE(OID, Name, ParentID)
AS
(
SELECT OID, Name, ParentID FROM Work.dbo.eaCategory
WHERE OID = 0
UNION ALL
SELECT C.OID, C.Name, C.ParentID FROM Work.dbo.eaCategory C JOIN CatCTE as CTE ON C.ParentID= CTE.OID
)
SELECT * FROM CatCTE