C# 搜索分层数据的最佳方法
我正在考虑建立一个工具,它允许使用分层过滤查询数据。我有一些想法,我将如何去做,但不知道是否有任何建议或建议,可能会更有效 例如,假设一个用户正在搜索一份工作。工作领域如下C# 搜索分层数据的最佳方法,c#,asp.net,sql-server-2005,recursive-query,C#,Asp.net,Sql Server 2005,Recursive Query,我正在考虑建立一个工具,它允许使用分层过滤查询数据。我有一些想法,我将如何去做,但不知道是否有任何建议或建议,可能会更有效 例如,假设一个用户正在搜索一份工作。工作领域如下 1: Scotland 2: --- West Central 3: ------ Glasgow 4: ------ Etc 5: --- North East 6: ------ Ayrshire 7: ------ Etc 用户可以搜索特定区域,如格拉斯哥或更大区域,如苏格兰 我正在考虑的两种方法是: 在数据库中记录
1: Scotland
2: --- West Central
3: ------ Glasgow
4: ------ Etc
5: --- North East
6: ------ Ayrshire
7: ------ Etc
用户可以搜索特定区域,如格拉斯哥或更大区域,如苏格兰
我正在考虑的两种方法是:
在数据库中记录每条记录的子项,即cat 1的子项字段中有2、3、4,并使用SELECT*FROM Jobs WHERE CATEGORES in ARELIES.childrenField查询该记录。
使用递归函数查找与选定区域相关的所有结果。
我从这两方面看到的问题是:
在数据库中保存这些数据意味着必须跟踪结构的所有更改。
递归是缓慢和低效的。
关于最佳方法有什么想法、建议或建议?我将C ASP.NET与MSSQL 2005 DB一起使用。您应该使用嵌套集。下面是MySQL中的一个实现 您可以使用来执行递归查询。我发现这项技术非常强大,易于阅读和维护。以下是我见过的一种方法: 创建一个名为hierarchyid的varcharmax字段。 为所有根对象生成基本ID。 为每个子对象生成一个id,并在其前面加上父id 示例表
ID(PK) HierarchyID Area
1 sl Scotland
2 slwc West Central
3 slwcgg Glasgow
示例查询
SELECT * FROM Areas Where HierarchyID LIKE 'sl%'
这个怎么样
表=>
身份证
父ID
名字
好简单的桌子
那么,来点复杂的好东西怎么样?我想是摇滚乐
public object FetchCategoryTree()
{
var sql = @"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
WITH AreaTree (ID, Name, ParentID, OrgLevel, SortKey) AS
(
-- Create the anchor query. This establishes the starting
-- point
SELECT
a.ID,
cast('---- ' + a.Name as varchar(255)),
a.ParentID,
cast('----' as varchar(55)),
CAST(a.ID AS VARBINARY(900))
FROM dbo.Area a
WHERE a.ParentID is null
UNION ALL
-- Create the recursive query. This query will be executed
-- until it returns no more rows
SELECT
a.ID,
cast('----' + b.OrgLevel + ' ' + a.Name as varchar(255)),
a.ParentID,
cast(b.OrgLevel+ '----' as varchar(55)),
CAST(b.SortKey + CAST (a.ID AS BINARY(4)) AS VARBINARY(900))
FROM dbo.Area a
INNER JOIN AreaTree b ON a.ParentID = b.ID
)
SELECT * FROM AreaTree
ORDER BY SortKey";
return FetchObject(sql);
}
现在,这就产生了一些SQL魔力,我对此不太确定。然而,用外行的话说,它基本上把第一部分作为根查询。然后它返回到表中,通过连接使用第一部分的答案执行第二部分,然后继续执行,直到仍然找不到任何匹配项,基本上是一个大循环。也很快
您将从一组带有排序键的行中获取数据。通过排序键对查询进行排序后,您将得到如下答案:
---- parent 1
-------- child 1
-------- child 2
------------ child 2.1
---- parent 2
-------- etc
可能就是您想要的吗?我在应用程序中使用Joe Celko的树模型来表示州/县/市/杂项的销售税层次结构,它运行良好 您在该区域或下面的“查找工作”查询将如下所示:
SELECT * FROM Jobs WHERE Jobs.AreaID IN
(SELECT P1.AreaID
FROM Areas AS P1, Areas AS P2
WHERE P1.lft BETWEEN P2.lft AND P2.rgt
AND P2.Areas.AreaID = @selectedAreaID)
如果您的表结构支持递归查询,您可以执行递归查询:您是否考虑过用XML对信息进行建模,并将其存储在数据库表的XML属性中,以便可以使用XQuery进行查询?在SQL Server 2008中,他们引入了一种数据类型HierarchyID,处理此方法:此方法看起来与我的选项1想法略有不同。很好,很简单,但是这意味着每次对类别进行更新时,都需要重新评估HeiratchyID。@WDuffy是的,您需要确保插入和更新正确计算hierarchyID。我没有使用上面示例中的代码,而是使用了IDs。e、 g.我将使用“/1/2/3/”而不是“slwcgg”。这个答案是关于嵌套集作为处理分层数据的技术。他只是在MySQL网站上链接了一个很好的解释。其中没有任何特定于MySQL的内容。