在 C# 中将 HierarchyId 转换为十六进制字符串,获取 CSV 导出的原始 ("representation") 值

Convert HierarchyId to Hex string in C#, get raw ("representation") value for CSV export

所以...对于从 SQL 服务器数据库导出的 CSV,使用 C# 和 Entity Framework,我需要获取 HierarchyId 的原始值。

原始值在 SSMS 中看起来像这样:0x29F9DC 我的 CSV 中的输出像这样:/-25/-5/.

CSV 是使用 StringBuilder 生成的,我实体的每一行都是通过 ToCsv 方法转换的:

return IdClassificationEc + ";" + Libelle + ";" + Complement;

其中 IdclassificationEchierarchyId

有或没有 ToString,我都得到了可读的值,但没有已知的方法来获取原始的十六进制值。

使用 T-SQL,我能够使用这个在字符串上获得好的值:

CONVERT(VARCHAR, CAST(evc.ID_CLASSIFICATION_EC AS VARBINARY), 1)

请帮我解决这个令人沮丧的问题:'(

在 SQL 服务器端:

declare @hid hierarchyid = '/1/1/1/';

select 
    v1 = convert(varchar(1000), cast(@hid as varbinary(892)), 1), -- = 0x5AD6
    v2 = convert(varchar(1000), cast(@hid as varbinary(892)), 2); -- = 5AD6

在 C# 中:

using System;
using Microsoft.SqlServer.Types;
using System.IO;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Conversion of SqlHierarchyId to Hex string:");

        var hid = SqlHierarchyId.Parse("/1/-1.12/-2.2.39/");    

        Console.WriteLine(HierarchyIdToHexString(hid)); // = 0x5A2C9F9D93E0 
    }

    private static String HierarchyIdToHexString(SqlHierarchyId hid) 
    {
        using (var ms = new MemoryStream())
        using (var binWriter = new BinaryWriter(ms))
        {
            hid.Write(binWriter);   
            var byteString = BitConverter.ToString(ms.ToArray()).Replace("-","");
            return String.Format("0x{0}", byteString);          
        }
    }   
}

这是 dotnetfiddle.net

上的工作示例

@Uranne,在 ToCsv() 中使用 HierarchyIdToHexString() 方法。