最近這幾天寫了個(gè)T4自動(dòng)實(shí)現(xiàn)EF code first和Ado的存儲(chǔ)過程。使用過程中發(fā)現(xiàn)了一個(gè)Sql的類型為HierarchyId。看到時(shí)真是百思不得齊姐。算了查一下MSDN吧。從微軟官網(wǎng)找到了HierarchyId類型。悲催了。這個(gè)字段沒有對(duì)應(yīng)C# CLR類型。使用EF6時(shí)報(bào)錯(cuò),提示我應(yīng)該是用Byte[]類型,執(zhí)行一遍程序。還是有錯(cuò)誤,算了谷歌吧。谷歌了一下,發(fā)現(xiàn)有解決方案了,什么HierarchyId而且不是SQLTypes的HierarchyId,哦 EF沒有找到,最后Nuget獲取到了 EntityFrameWork.HierarchyId。OK完美運(yùn)行,查詢出來了。
HierarchyId到底是什么呢?
HierarchyId是SQL Server 2008的一個(gè)重要新增特性。主要解決的問題是擁有層次關(guān)系的表格。例如文檔結(jié)構(gòu)圖。我們一般會(huì)用一個(gè)Document表保存文檔數(shù)據(jù),而每個(gè)文檔則又可能會(huì)有相應(yīng)的上級(jí)文件夾。以前要得到某個(gè)文件的所有上級(jí),或者某個(gè)文件所有下級(jí),通常所采取的方法都是遞歸。SQL Server 2005開始支持的CTE從一定程序上方便了該工作的實(shí)現(xiàn)。
例子就用微軟的AdventureWorks2012里面的PRoduction.Document:
創(chuàng)建表語句如下:
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 數(shù)據(jù)類型的方法;初次之外還有
具體大家可以參考msdn官方文檔。
那么插入某個(gè)節(jié)點(diǎn)的數(shù)據(jù)怎么辦呢?
官方也給了辦法 就是先查詢父節(jié)點(diǎn)下最大子節(jié)點(diǎn)
然后創(chuàng)建一個(gè)新的子節(jié)點(diǎn)
declare @HyId hierarchyid=父節(jié)點(diǎn);declare @NewHyId hierarchyid;
select @NewHyId=@HyId.GetDescendant(MAX(DocumentNode),null) from DocumentWhere DocumentNode_Id.GetAncestor(1)=@HyId --創(chuàng)建一個(gè)新的節(jié)點(diǎn)
select @NewHyId.ToString()
然后將新的節(jié)點(diǎn)添加到數(shù)據(jù)庫(kù)中。希望微軟以后能添加數(shù)據(jù)類型到CLR和能自動(dòng)生成新的hierarchyid根據(jù)傳入的父hierarchyid
當(dāng)然微軟官方有索引優(yōu)化建議,希望大家去看一下
查詢時(shí)可以使用SQL類型到C#
新聞熱點(diǎn)
疑難解答
圖片精選