sql-server – 在实体框架4中有没有实用的方法来使用hierarchyID数据类型?

前端之家收集整理的这篇文章主要介绍了sql-server – 在实体框架4中有没有实用的方法来使用hierarchyID数据类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
现在,包含HierarchyID的CLR UDT在实体框架4中不受支持.HierarchyID.ToString()是有用的,但一旦任何项目有10个兄弟节点(基本结构是/ 3/4/12 /或/ 3/4/2 /所以第12个节点将在第2个节点之前排序).

更多关于潜在的选择:

带回一个varbinary的hierarchyID,并实现自己的二进制排序
>将hierarchyID作为varbinary返回,并实现我自己的hierarchyID.ToString()方法,它在构建字符串时用零填充数字,以便生成的字符串是可排序的(即“/ 0003/0004/0012 /”).我解析了Microsoft.sqlServer.Types.dll并查看了实现.它看起来像是一个叫做“OrdTree”的类,它可以用该类作为重新实现的基础.
>为sql编写自己的CLR类型,以处理二进制数据并构建自己的字符串(选项2的变体).虽然,附加部署头痛.
>编写一个sql udf来解析层次结构字符串,并在DB层上进行填充.数组处理/正则表达式的缺乏似乎是这里最大的问题.
>按照数据库层上的hierarchyID进行排序,并使用ROW_NUMBER()函数作为排序顺序.
>在.net层上写一些帮助方法,重新解析hierarchyId.ToString()并生成一个可排序的字符串(即“/ 0003/0004/0012 /”).

所以我的问题是有人围绕这个限制吗?您是否使用上述任何策略?如果是这样,怎么办?

解决方法

嗯,我似乎正在获得意见,但没有回应.我有一些立即需要处理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,DEFAULT_PAD_LEN);
    }
    public static string AppendChild (string Hierarchy,int padLen) {
        return Hierarchy + childIndex.ToString().PadLeft(padLen,DEFAULT_PAD_CHAR) + "/";
    }
}

希望这有助于某人!虽然,我还是想听听人的意见.

猜你在找的MsSQL相关文章