羅萬(wàn)波
(福建省測(cè)繪院,福建福州 350003)
LINQ在水土保持管理系統(tǒng)開(kāi)發(fā)中的應(yīng)用
羅萬(wàn)波
(福建省測(cè)繪院,福建福州 350003)
介紹了.NET語(yǔ)言集成查詢(xún)LINQ(Language Integrated Query)的結(jié)構(gòu)和原理,并利用它實(shí)現(xiàn)了水土保持管理系統(tǒng)的多種類(lèi)型的數(shù)據(jù)查詢(xún)統(tǒng)計(jì),通過(guò)實(shí)例的應(yīng)用和分析表明LINQ技術(shù)為開(kāi)發(fā)者提供了一種簡(jiǎn)單高效的數(shù)據(jù)訪問(wèn)方法。
GIS;LINQ;水土保持管理系統(tǒng);.NET3.5
水土保持管理系統(tǒng)主要圍繞水土流失監(jiān)測(cè)、治理、預(yù)防、開(kāi)發(fā)建設(shè)等功能進(jìn)行設(shè)計(jì)和開(kāi)發(fā),在系統(tǒng)中包含多種不同類(lèi)型的數(shù)據(jù)源。過(guò)去對(duì)多種類(lèi)型的數(shù)據(jù)源查詢(xún)需要不同的查詢(xún)語(yǔ)言,例如對(duì)關(guān)系數(shù)據(jù)庫(kù)我們使用SQL語(yǔ)言,對(duì)XML則使用XQuery語(yǔ)言,而LINQ大大簡(jiǎn)化了這種情形,它提供一個(gè)固定的編程模型,能夠兼容各種數(shù)據(jù)源和數(shù)據(jù)格式,即對(duì)LINQ兼容的數(shù)據(jù)格式如XML文檔、SQL數(shù)據(jù)、ADO.NET數(shù)據(jù)集、NET集合等都能使用相同的代碼模式進(jìn)行查詢(xún)。不僅如此,它還彌補(bǔ)了數(shù)據(jù)和對(duì)象之間的鴻溝,提高我們的開(kāi)發(fā)效率,傳統(tǒng)的數(shù)據(jù)查詢(xún)一般是簡(jiǎn)單的字符串,缺少編譯時(shí)類(lèi)型檢查和智能感應(yīng)支持,而LINQ在C#和VB里面定義了以查詢(xún)?yōu)榈谝晃坏恼Z(yǔ)言,對(duì)于強(qiáng)類(lèi)型的對(duì)象集合就可以使用熟悉的語(yǔ)言和操作寫(xiě)出查詢(xún),并有便捷的VS內(nèi)置幫助,因此可以充分利用強(qiáng)類(lèi)型檢查和智能感知來(lái)大幅提高編寫(xiě)代碼的效率。
LINQ即Language Integrated Query,它是集成在.NET編程語(yǔ)言中的一種特性,已成為編程語(yǔ)言的一個(gè)組成部分。在編寫(xiě)程序時(shí),有編譯時(shí)語(yǔ)法檢查、豐富的元數(shù)據(jù)、智能感知、靜態(tài)類(lèi)型等強(qiáng)類(lèi)型語(yǔ)言的優(yōu)點(diǎn),并且它還可以方便地對(duì)內(nèi)存中的信息進(jìn)行查詢(xún)而不僅僅只是外部數(shù)據(jù)源。它是 Visual Studio 2008和.NET Framework 3.5版中一項(xiàng)突破性的創(chuàng)新,它在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間架起了一座橋梁,它為 C#和 Visual Basic語(yǔ)言語(yǔ)法提供強(qiáng)大的查詢(xún)功能。LINQ引入了標(biāo)準(zhǔn)的、易于學(xué)習(xí)的查詢(xún)和更新數(shù)據(jù)模式,可以對(duì)其技術(shù)進(jìn)行擴(kuò)展,可支持幾乎任何類(lèi)型的數(shù)據(jù)存儲(chǔ)。LINQ體系結(jié)構(gòu)見(jiàn)圖1,它分為三大類(lèi)型的數(shù)據(jù):①Linq To Objects,其主要是針對(duì)CLR-Based Objects的查詢(xún),即內(nèi)存操作;②Linq Enabled ADO.NET是針對(duì)關(guān)系型數(shù)據(jù)的,它又包含三種:Linq To Datasets,Linq To Sql, Linq To Entities;③Linq To XML,針對(duì)xm l格式數(shù)據(jù)的操作。LINQ的查詢(xún)機(jī)制見(jiàn)圖2,所有LINQ查詢(xún)操作都由獲取數(shù)據(jù)源、創(chuàng)建查詢(xún)和執(zhí)行查詢(xún)的三個(gè)部分組成,在LINQ中,查詢(xún)的執(zhí)行與查詢(xún)本身截然不同,如果只是創(chuàng)建查詢(xún)變量,則不會(huì)檢索任何數(shù)據(jù)。
圖1 LINQ體系結(jié)構(gòu)圖 [1]
圖2 LINQ查詢(xún)機(jī)制 [2]
在水土保持管理系統(tǒng)中的水土流失動(dòng)態(tài)監(jiān)測(cè)模塊,需要對(duì)水土流失、工程侵蝕和崩崗的表數(shù)據(jù)進(jìn)行分類(lèi)查詢(xún)統(tǒng)計(jì),雖然ArcEngine也提供這些功能,但是查詢(xún)語(yǔ)言都是以字符串形式,在VS中在對(duì)字符串的編譯過(guò)程中的錯(cuò)誤檢查就大大減弱,因此采用LINQ更為簡(jiǎn)單和高效。以下通過(guò)具體的實(shí)例對(duì)LINQ的應(yīng)用進(jìn)行說(shuō)明。
2.1 Summarize功能實(shí)現(xiàn)
Summarize功能核心是對(duì)數(shù)據(jù)分類(lèi)查詢(xún)統(tǒng)計(jì)如圖3所示,在崩崗圖層中可以根據(jù)不同的字段,對(duì)字段里的內(nèi)容進(jìn)行分組,在圖3里是對(duì)崩崗的形態(tài)進(jìn)行分組,崩崗在當(dāng)前shp文件中有瓢形、混合型、弧形、條形、爪形、茞形和陶形七種形態(tài),然后根據(jù)所選的字段,自動(dòng)判斷其類(lèi)型,如數(shù)值型的就統(tǒng)計(jì)其總和和平均值,若是字符串型就按當(dāng)前字段排序獲取最先最后獲取的字段值。如圖中的溝口寬度和防治面積,根據(jù)形態(tài)分組計(jì)算圖斑的數(shù)值總和和平均值,土壤類(lèi)型則是字符型字段,它是根據(jù)分組獲取排序后最先的這個(gè)字段值。其功能完全類(lèi)似ArcMap的Summarize功能[4]。
圖3 崩崗Summarize功能
在LINQ里用groupby對(duì)查詢(xún)的結(jié)果進(jìn)行分組,實(shí)現(xiàn)的代碼極其簡(jiǎn)單,以總和計(jì)算為例,
以上是獲取數(shù)據(jù)源、創(chuàng)建查詢(xún)的操作,程序運(yùn)行時(shí)候,并不執(zhí)行以上代碼,實(shí)現(xiàn)執(zhí)行查詢(xún)操作代碼如下;
2.2 不同年度面積變化功能實(shí)現(xiàn)
根據(jù)不同年度水土流失的流失強(qiáng)度統(tǒng)計(jì)面積的變化,流失強(qiáng)度可分為極強(qiáng)烈流失、劇烈流失、強(qiáng)烈流失、中度流失、輕度流失和微度流失。一種流失強(qiáng)度就有多個(gè)圖斑或者是零個(gè)圖斑,這就涉及到表關(guān)系中的一對(duì)多的關(guān)系,由于是不同年度的數(shù)據(jù),這就要實(shí)現(xiàn)多個(gè)數(shù)據(jù)表的操作。首先獲取不同流失強(qiáng)度的面積,代碼如下:
然后就是不同年度的各個(gè)流失強(qiáng)度的面積進(jìn)行多個(gè)表聯(lián)合查詢(xún),代碼如下:
運(yùn)行的結(jié)果界面如圖4所示。
圖4 不同年度流失強(qiáng)度變化
2.2 調(diào)查報(bào)告文檔管理
微軟推出LINQ to XML,使得操作XML更簡(jiǎn)單.更方便.更智能的XMLAPI[3]。以前的.NETXML編程模型需要使用很多冗長(zhǎng)的DOM API,而LINQ to XML則完全可以用與DOM無(wú)關(guān)的方式與XML文檔交互,這樣不但大大減少了代碼行,而且這種編程模型可以直接映射到格式良好的 XML文檔結(jié)構(gòu)。由此,采用XML作為數(shù)據(jù)載體,通過(guò)LINQ to XML提供的類(lèi)實(shí)現(xiàn)調(diào)查報(bào)告文檔管理模塊添加、查詢(xún)、更新和刪除等操作,其實(shí)現(xiàn)的功能界面如圖5所示。
圖5 讀取XML的調(diào)查報(bào)告文檔功能界面
在這模塊里主要實(shí)現(xiàn)以下內(nèi)容[5]:① 在內(nèi)存中創(chuàng)建LINQ to XML文檔;②使用LINQ查詢(xún)創(chuàng)建XML文檔;③加載和解析LINQ to XML內(nèi)容;④遍歷內(nèi)存中的LINQ to XML文檔;⑤LINQ to XML加載;⑥LINQ to XML遍歷;⑦LINQ to XML查詢(xún);⑧修改LINQ to XML文檔。XML操作主要通過(guò)XDocument、Xelement、Xdeclaration和Xattribute來(lái)實(shí)現(xiàn)的。
LINQ是VisualStudio2008和.NETFramework3.5版本中一項(xiàng)突破性的創(chuàng)新,在水土保持管理系統(tǒng)開(kāi)發(fā)中利用它實(shí)現(xiàn)多種數(shù)據(jù)源的查詢(xún)統(tǒng)計(jì)。開(kāi)發(fā)實(shí)踐表明其簡(jiǎn)單易學(xué)、代碼少,效率高、大大縮短開(kāi)發(fā)周期。它通過(guò)面向?qū)ο缶幊痰臏?zhǔn)則應(yīng)用于關(guān)系數(shù)據(jù),簡(jiǎn)化了面向?qū)ο缶幊膛c關(guān)系數(shù)據(jù)之間的交互,使用單一的一種語(yǔ)法來(lái)實(shí)現(xiàn)多種不同對(duì)象的查詢(xún),為開(kāi)發(fā)者提供了一種簡(jiǎn)單高效的數(shù)據(jù)訪問(wèn)方法。
[1] Am ro Khasawneh.Understanding LNQ(C#)[EB/OL].http:// www.codeproject.com/KB/linq/UnderstandingLINQ.aspx? msg=2668049,2007-06-12
[2] M icrosoft MSDN.LINQ介紹[EB/OL].Http://msdn.microsoft. com/zh-cn/library/bb397897.aspx,2007-11-01
[3] 姜玉振,李月鳳.運(yùn)用LINQ to XML開(kāi)發(fā)用戶(hù)登陸授權(quán)的動(dòng)態(tài)菜單系統(tǒng)[J].電腦編程技巧與維護(hù),2009(21):26-40
[4] 黨安榮,賈海峰,易善楨,等.ArcGIS 8Desktop地理信息系統(tǒng)應(yīng)用指南[M].北京:清華大學(xué)出版社,2003
[5](美)克萊因.LINQ高級(jí)編程[M].北京:清華大學(xué)出版社,2009
Application of LINQ to Soil and Water Conservation Management System
by LuoWanbo
The paper introduced framework and principles o f.NET Language Integrated Query,and used it to achieve multiple types of data query statistics of the Soil and water conservation management system.It showed that LINQ technology provides simple and effective data access methods for developers by analysis of and using of the exam p les.
GIS,LINQ,soil conservation management system,.NET3.5(Page:106)
P208
B
1672-4623(2010)06-0106-03
2010-05-10
項(xiàng)目來(lái)源:福建省科技計(jì)劃資助項(xiàng)目(2008N0117)。
羅萬(wàn)波,工程師,主要從事地理信息系統(tǒng)應(yīng)用開(kāi)發(fā)及航測(cè)、遙感數(shù)據(jù)處理等工作。