Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索分层数据的最佳方法_C#_Asp.net_Sql Server 2005_Recursive Query - Fatal编程技术网

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的内容。