国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

層次關(guān)系表格,不用遞歸,快速檢索。HierarchyId

2024-07-21 02:49:38
字體:
供稿:網(wǎng)友
層次關(guān)系表格,不用遞歸,快速檢索。HierarchyId

最近這幾天寫了個(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:

image

創(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ù)類型的方法;初次之外還有

image

具體大家可以參考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#


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 璧山县| 田阳县| 兴国县| 马龙县| 阿坝县| 霍山县| 白朗县| 彭州市| 广河县| 开鲁县| 耿马| 永顺县| 连平县| 和田县| 老河口市| 永丰县| 曲阳县| 宜黄县| 姚安县| 龙胜| 修文县| 商都县| 司法| 阳曲县| 濮阳市| 民丰县| 澄江县| 和田县| 瑞丽市| 灯塔市| 泗洪县| 石棉县| 肇庆市| 恩施市| 治县。| 宿迁市| 遂川县| 昌江| 洛扎县| 淮南市| 泸溪县|