在Entity Framework 4中,有没有实际使用hierarchyID数据类型的方法?

15
目前,实体框架4不支持包括层次结构ID在内的CLR UDTs。 HierarchyID.ToString()很有用,但是一旦任何项具有10个或以上的兄弟项时(基本结构为/3/4/12//3/4/2/,因此第12个节点将在第2个节点之前排序),会出现错误。
关于可能的选项:
- 将hierarchyID作为varbinary带回并实现自己的二进制排序器 - 将hierarchyID作为varbinary带回,并实现自己的hierarchyID.ToString()方法,该方法在构建字符串时填充数字以使结果可排序(即"/0003/0004/0012/")。我反汇编了Microsoft.SqlServer.Types.dll并查看了实现。它看起来基于一个名为“OrdTree”的类,我可以将该类用作重新实现的基础。 - 为SQL编写自己的CLR类型以处理二进制数据并构建其自己的字符串(选项2的变异)。尽管如此,它带来了额外的部署问题。 - 编写一个SQL UDF来解析层次结构字符串并在DB层上进行填充。这里似乎缺乏阵列处理/正则表达式是最大的问题。 - 在数据库层使用层次结构ID排序,并使用ROW_NUMBER()函数作为排序顺序的替代品。 - 在.NET层上编写一些辅助方法,重新解析hierarchyId.ToString()并生成可排序的字符串(即“/0003/0004/0012/”)。
所以我的问题是,有人解决了这个限制吗?您使用了以上任何策略吗?如果是这样,如何解决?

近12年后——这已被添加为SqlClient审查委员会的高优先级任务。 https://github.com/dotnet/SqlClient/projects/2#card-29525366 - EBarr
1个回答

4

嗯,我似乎得到了浏览量,但没有回应。我有一些需要立即处理的关于 SQL 上面层次结构的需求,所以我编写了一个静态辅助类。我不认为这是一个完整的解决方案,但到目前为止它相对有效。在这里,PadPath 函数真的很关键。

public static class SQLHierarchyManipulatin {
    const int   DEFAULT_PAD_LEN     = 3;
    const char  DEFAULT_PAD_CHAR    = '0';

    public static string PadPath(string Hierarchy) {
        return PadPath (Hierarchy, DEFAULT_PAD_LEN);
    }       
    public static string PadPath(string Hierarchy, int padLen) {
        string[]    components  = Hierarchy.Split('/');

        for (var i = 0; i < components.Length; i++ ) {
            if (components[i] != "") {
                components[i] = components[i].PadLeft(padLen, DEFAULT_PAD_CHAR);
            }
        }
        return string.Join("/", components);
    }

    public static int CurrentNodeIndex(string Hierarchy) {
        string[]    components  = Hierarchy.Split('/');
        string      startItem   = components[components.Length - 2]; //one slot back from trailing slash

        return int.Parse(startItem);
    }

    public static string ParentPath (string Hierarchy) {
        return  Hierarchy.Substring(0, Hierarchy.TrimEnd('/').LastIndexOf('/') + 1);
    }

    public static string AppendChildWithPadding (string Hierarchy, int childIndex, int padLen) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChildWithPadding (string Hierarchy, int childIndex) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChild (string Hierarchy, int childIndex) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChild (string Hierarchy, int childIndex, int padLen) {
        return Hierarchy + childIndex.ToString().PadLeft(padLen, DEFAULT_PAD_CHAR) + "/";
    }
}

希望这能帮到一些人!不过,我仍然想听听其他人的意见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接