Linq to sql Linq to SQL或Linq to Entities 4.0是否支持hierarchyid数据类型

Linq to sql Linq to SQL或Linq to Entities 4.0是否支持hierarchyid数据类型,linq-to-sql,sql-server-2008,linq-to-entities,.net-4.0,Linq To Sql,Sql Server 2008,Linq To Entities,.net 4.0,它们是使用linq to SQL/Entities 4.0处理层次结构数据类型的一种方法吗?总之,不是。无论如何,不是直接的。不过,你也许可以。我还没有尝试过。目前,Microsoft ORM系列中没有一个可以使用CLR用户定义类型(包括内置的hierarchyid和地理空间类型)作为列类型 如果在数据库中使用这些选项,则有两种解决方法: 使用表达式CAST(hid为varbinary892))将计算列添加到层次结构表中。您需要确保将此列包含在Linq使用的每个查询(包括存储过程)中。然后,将此

它们是使用linq to SQL/Entities 4.0处理层次结构数据类型的一种方法吗?

总之,不是。无论如何,不是直接的。不过,你也许可以。我还没有尝试过。

目前,Microsoft ORM系列中没有一个可以使用CLR用户定义类型(包括内置的
hierarchyid
和地理空间类型)作为列类型

如果在数据库中使用这些选项,则有两种解决方法:

  • 使用表达式
    CAST(hid为varbinary892))
    将计算列添加到层次结构表中。您需要确保将此列包含在Linq使用的每个查询(包括存储过程)中。然后,将此列添加到实体映射中

    此时,您可以通过添加对
    Microsoft.SqlServerTypes
    的引用,并使用
    BinaryReader
    /
    BinaryWriter
    类将BLOB数据转换为
    SqlHierarchyId
    ,来扩展实体的分部类,以添加“real”
    hierarchyid
    列作为自己的属性

    请注意,您不能针对该列编写Linq查询。如果您尝试,您只会得到一个“不支持翻译”错误。因此请记住,这是一个有限的解决方法

  • 另一个选项,也是我通常喜欢的,是根本不在L2S/EF中使用
    hierarchyid
    列。将单独索引的代理自动inc键添加到层次结构表中,并将
    hierarchyid
    视为实现细节。使用UDF和视图实现只需要代理ID作为参数的分层查询

    这听起来很痛苦,但如果你从一开始就这样工作,也没那么糟糕。在微软推出
    hierarchyid
    类型之前,我使用的是丹尼斯·福布斯(Dennis Forbes)的物化路径层次结构的改编,它基于邻接列表,并将路径维护为一种非规范化
    hierarchyid
    使这一点更容易实现

    不幸的是,我没有一个完整的工作示例来说明维护
    hierarchyid
    和邻接列表之间的正确关联所需的所有操作,但是如果您阅读了它,这应该是一个好的开始。不要实现物化路径,而是使用
    hierarchyid
    ,而是阅读有关使用触发器实现自维护层次结构的章节

    如果Microsoft确实在其ORM中实现了对
    hierarchyid
    的支持,那么很容易删除邻接列表并专门切换到基于
    hierarchyid
    的解决方案。但是,由于管理基于
    hierarchyid
    的层次结构需要维护大量存储过程(因为您没有“自动”ID),因此您应该熟悉围绕层次结构查询编写大量SQL UDF和存储过程抽象


  • 我们使用与Aaronaught类似的解决方案,使用LINQtoSQL

    我们已经创建了计算列

        TreeId.ToString()
    
    对于当前hierarchyid列和

        [TreeId].[GetAncestor](1).ToString()
    
    直接父母的

    我们还创建了一个排除hierarchyid列的视图,并将该视图拖到Dbml图上,并设置与引用表的关联


    不过,大多数分层功能都需要以存储过程的形式出现。

    Whoa..非常感谢。我刚刚决定将hierarchyid转换为blob并将其转换回hierarchyid。我正在研究如何做到这一点。谢谢