gpt4 book ai didi

sql-server - 有没有一种实用的方法可以在 Entity Framework 4中使用hierarchyID数据类型?

转载 作者:行者123 更新时间:2023-12-02 07:31:26 24 4
gpt4 key购买 nike

就目前情况而言,Entity Framework 4 不支持包括 HierarchyID 在内的 CLR UDT。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 层。缺乏数组处理/正则表达式似乎是这里最大的问题。

  • 在数据库层上按 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, 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) + "/";
}
}

希望这对某人有帮助!尽管如此,我仍然想听听人们的意见。

关于sql-server - 有没有一种实用的方法可以在 Entity Framework 4中使用hierarchyID数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3347860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com