最近這幾天寫了個T4自動實現EF code first和Ado的存儲過程。使用過程中發現了一個Sql的類型為HierarchyId??吹綍r真是百思不得齊姐。算了查一下MSDN吧。從微軟官網找到了HierarchyId類型。悲催了。這個字段沒有對應C# CLR類型。使用EF6時報錯,提示我應該是用Byte[]類型,執行一遍程序。還是有錯誤,算了谷歌吧。谷歌了一下,發現有解決方案了,什么HierarchyId而且不是SQLTypes的HierarchyId,哦 EF沒有找到,最后Nuget獲取到了 EntityFrameWork.HierarchyId。OK完美運行,查詢出來了。
HierarchyId到底是什么呢?
HierarchyId是SQL Server 2008的一個重要新增特性。主要解決的問題是擁有層次關系的表格。例如文檔結構圖。我們一般會用一個Document表保存文檔數據,而每個文檔則又可能會有相應的上級文件夾。以前要得到某個文件的所有上級,或者某個文件所有下級,通常所采取的方法都是遞歸。SQL Server 2005開始支持的CTE從一定程序上方便了該工作的實現。
例子就用微軟的AdventureWorks2012里面的PRoduction.Document:
創建表語句如下:
CREATE TABLE [Production].[Document]( [DocumentNode] [hierarchyid] NOT NULL, [DocumentLevel] AS ([DocumentNode].[GetLevel]()), [Title] [nvarchar](50) NOT NULL, [Owner] [int] NOT NULL, [FolderFlag] [bit] NOT NULL, [FileName] [nvarchar](400) NOT NULL, [FileExtension] [nvarchar](8) NOT NULL, [Revision] [nchar](5) NOT NULL, [ChangeNumber] [int] NOT NULL, [Status] [tinyint] NOT NULL, [DocumentSummary] [nvarchar](max) NULL, [Document] [varbinary](max) NULL, [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL, [ModifiedDate] [datetime] NOT NULL, CONSTRAINT [PK_Document_DocumentNode] PRIMARY KEY CLUSTERED ( [DocumentNode] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],UNIQUE NONCLUSTERED ( [rowguid] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
其中 GetLevel 為 hierarchyid 數據類型的方法;初次之外還有
具體大家可以參考msdn官方文檔。
那么插入某個節點的數據怎么辦呢?
官方也給了辦法 就是先查詢父節點下最大子節點
然后創建一個新的子節點
declare @HyId hierarchyid=父節點;declare @NewHyId hierarchyid;
select @NewHyId=@HyId.GetDescendant(MAX(DocumentNode),null) from DocumentWhere DocumentNode_Id.GetAncestor(1)=@HyId --創建一個新的節點
select @NewHyId.ToString()
然后將新的節點添加到數據庫中。希望微軟以后能添加數據類型到CLR和能自動生成新的hierarchyid根據傳入的父hierarchyid
當然微軟官方有索引優化建議,希望大家去看一下
查詢時可以使用SQL類型到C#
新聞熱點
疑難解答