В настоящее время CLR UDT, включая HierarchyID, не поддерживаются в Entity Framework 4. HierarchyID.ToString() полезен, но разбивается, как только у любого элемента есть 10+ братьев и сестер (основная структура - это 3/4/12/или/3/4/2/, поэтому 12-й node будет сортировать до 2-го node).
Немного больше о возможных вариантах:
-
Верните иерархический идентификатор в качестве varbinary и реализуйте мой собственный двоичный сортировщик
-
Верните иерархический идентификатор в качестве varbinary и реализуйте мой собственный метод hierarchyID.ToString(), который заполняет цифры нулями при построении строки, чтобы результирующая строка была сортируемой (например, "0004 0004/0012/" ), Я разобрал Microsoft.SqlServer.Types.dll и посмотрел на реализацию. Похоже, что интеркалы основаны на классе под названием "OrdTree", и я мог бы использовать этот класс в качестве основы для повторной реализации.
-
Напишите мой собственный тип CLR для SQL для работы с двоичными данными и создания собственной строки (вариант варианта 2). Хотя, поставляется с добавленной головной болью развертывания.
-
Напишите SQL udf для синтаксического анализа строки иерархии и поместите ее на уровень БД. Отсутствие обработки массивов /regex кажется самой большой проблемой здесь.
-
Сортировка по иерархииID на уровне базы данных и использование функции ROW_NUMBER() в качестве подставки для порядка сортировки.
-
Напишите некоторые вспомогательные методы на .net-слое, которые повторно анализируют иерархиюId.ToString() и создают сортируемую строку (например, "/0003/0004/0012/" ).
Итак, мой вопрос: кто-нибудь работал над ограничением? Использовали ли вы какие-либо из вышеперечисленных стратегий? Если да, то как?