13

Hiện tại, các UDT của CLR bao gồm HierarchyID không được hỗ trợ trong Entity Framework 4. HierarchyID.ToString() rất hữu ích, nhưng bị phá vỡ khi bất kỳ mục nào có 10+ anh chị em (cấu trúc cơ bản là /3/4/12/ hoặc /3/4/2/ để nút thứ 12 sắp xếp trước nút thứ 2).Có cách nào thực tế để sử dụng kiểu dữ liệu phân cấp trong khung thực thể 4 không?

hơn Một chút về các lựa chọn tiềm năng:

  • Mang lại HierarchyId như một varbinary và thực hiện sorter nhị phân của riêng tôi

  • Mang lại HierarchyId như một varbinary và thực hiện riêng hierarchyID.ToString tôi () Phương thức sẽ đánh số các con số bằng số 0 trong khi tạo chuỗi để chuỗi có thể sắp xếp (ví dụ: "/ 0003/0004/0012 /"). Tôi đã tháo gỡ Microsoft.SqlServer.Types.dll và xem xét việc triển khai. Có vẻ như các interals dựa trên một lớp được gọi là "OrdTree" và tôi có thể sử dụng lớp đó làm cơ sở để thực hiện lại.

  • Viết loại CLR của riêng tôi cho SQL để làm việc trên dữ liệu nhị phân và xây dựng chuỗi riêng của nó (một biến thể của tùy chọn 2). Mặc dù, đi kèm với một nhức đầu triển khai thêm.

  • Viết một udf SQL để phân tích cú pháp chuỗi phân cấp và đệm nó trên lớp DB. Việc thiếu xử lý mảng/regex dường như là vấn đề lớn nhất ở đây.

  • Sắp xếp theo phân cấpID trên lớp cơ sở dữ liệu và sử dụng hàm ROW_NUMBER() làm giá trị đứng cho thứ tự sắp xếp.

  • Viết một số phương pháp helper trên lớp .net mà lại phân tích hierarchyId.ToString() và tạo ra một chuỗi sắp xếp được (ví dụ: "/ 0003/0004/0012 /").

Vì vậy, câu hỏi của tôi là có ai làm việc xung quanh giới hạn không? Bạn có sử dụng bất kỳ chiến lược nào ở trên không? Nếu vậy, làm thế nào?

Trả lời

3

Vâng, tôi dường như đang nhận được lượt xem nhưng không có phản hồi. Tôi đã có một số nhu cầu trước mắt để làm việc với cấu trúc phân cấp trên SQL, vì vậy tôi đặt cùng một lớp trợ giúp tĩnh. Tôi không coi đây là một giải pháp hoàn chỉnh, nhưng cho đến nay nó hoạt động tương đối tốt. PadPath thực sự là chức năng quan trọng ở đây.

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) + "/"; 
    } 
} 

Hy vọng điều này sẽ giúp ai đó! Mặc dù, tôi vẫn muốn nghe từ mọi người.