Dapper不直接支持SQL Server的hierarchyid类型,需通过字符串映射、原生SQL处理或自定义TypeHandler配合Microsoft.SqlServer.Types实现读写与层次查询。

Dapper 本身不直接支持 SQL Server 的 hierarchyid 类型,但可以通过类型映射、自定义转换和原生 SQL 配合实现完整读写与层次查询。
Dapper 默认将 hierarchyid 映射为 byte[] 或 string(取决于数据库驱动返回值),无法直接调用其方法(如 .GetAncestor()、.IsDescendantOf())。SQL Server 的 hierarchyid 是 CLR UDT 类型,需显式处理。
Microsoft.Data.SqlClient(推荐)时,hierarchyid 列默认返回 SqlHierarchyId 实例(需引用 Microsoft.SqlServer.Types)System.Data.SqlClient(已弃用),则通常退化为 byte[],需手动反序列化(不推荐)SqlHierarchyId.Parse() 或 .ToString(),需在代码或 SQL 层转换最实用的方式是让 SQL 返回可读的路径字符串(如 /1/2/3/),避免 .NET 端依赖 SQL Server 类型库。
CONVERT(VARCHAR, hierarchy_column) 或 hierarchy_column.ToString()
string 属性,便于日志、前端展示和简单比较var nodes = connection.Query<OrgNode>(@"
SELECT Id, Name, CONVERT(VARCHAR(50), Path) AS PathStr
FROM OrgNodes
WHERE Path.IsDescendantOf(CONVERT(HIERARCHYID, @root)) = 1",
new { root = "/1/" });层级逻辑(如查找子树、计算层级深度、插入子节点)强烈建议在 SQL 中完成,而非在 C# 中解析 hierarchyid 字节数组。
GetDescendant(NULL, NULL) 或 GetReparentedValue() 生成路径WHERE Path.IsDescendantOf(@parent) = 1
AND Path.GetLevel() = @parentLevel + 1
若需在 .NET 中构造或验证 hierarchyid(如后台批量生成树),可引入 Microsoft.SqlServer.Types 并注册自定义类型处理器。
Microsoft.SqlServer.Types
Dapper.SqlMapper.AddTypeHandler(typeof(SqlHierarchyId),
new SqlHierarchyIdTypeHandler());string → SqlHierarchyId.Parse(),反之调用 .ToString()
基本上就这些。核心原则是——把 hierarchyid 当作 SQL Server 的“黑盒路径类型”来用,Dapper 负责安全传参和结果映射,真正的树形逻辑留在 T-SQL 里执行,既高效又可靠。
以上就是Dapper如何处理SQL Server的hierarchyid类型 Dapper层次数据查询的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号