成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

LINQtoSQL與NHibernate有什么不同

這篇文章主要講解了“LINQ to SQL與NHibernate有什么不同”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“LINQ to SQL與NHibernate有什么不同”吧!

成都創(chuàng)新互聯(lián)公司成立于2013年,先為那坡等服務(wù)建站,那坡等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為那坡企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

1引言

研發(fā)與數(shù)據(jù)庫打交道的系統(tǒng)的時候,最過于繁瑣的莫過于沒有編程快感的使用ADO.NET對后臺數(shù)據(jù)庫進行操作,因為所有的數(shù)據(jù)庫連接、讀取、操作千篇一律,編程成為了體力活。

雖然我們可以設(shè)計自己的類作為數(shù)據(jù)庫訪問的持久層,但是每一個類都必須有不相同的SQL語句,這樣對于設(shè)計統(tǒng)一的數(shù)據(jù)庫讀寫類造成了很大的困難。

開發(fā)人員在這種情況下必須包辦窗體設(shè)計、方法設(shè)計、數(shù)據(jù)庫讀寫設(shè)計的過程,這樣加大了開發(fā)人員的負(fù)擔(dān)也使得項目的維護和后期開發(fā)變得難以進行。

2 .NET下的ORM解決方案

2.1 LINQ

2.1.1 LINQ簡介

作為微軟開發(fā)的查詢方案,LINQ 提供了一條更常規(guī)的途徑即給 .Net Framework 添加一些可以應(yīng)用于所有信息源( all sources of information )的具有多種用途( general-purpose )的語法查詢特性( query facilities ),這是比向開發(fā)語言和運行時( runtime )添加一些關(guān)系數(shù)據(jù)( relational )特性或者類似 XML 特性( XML-specific )更好的方式。這些語法特性就叫做 .NET Language Integrated Query (LINQ) 。

如果覺得上面的解釋有點抽象,那么可以這樣理解,LINQ其實就是提供了一套查詢功能,可以實現(xiàn)任何數(shù)據(jù)源的查詢,此處數(shù)據(jù)源不單指數(shù)據(jù)庫或者XML文件,而是任何集合或者實體,比如我們接觸各種編程語言都需要用到的數(shù)組,現(xiàn)在不用遍歷數(shù)組元素來尋找需要的項,LINQ可以實現(xiàn)這方面的查詢。

LINQ查詢數(shù)組:

LINQ to SQL與NHibernate有什么不同

圖2.1 LINQ查詢數(shù)組

上面是最簡單的LINQ實現(xiàn)對數(shù)組的查詢,泛型類型var在LINQ查詢中提供了強大的委托類型支持,不管查詢集合中項的類型(無論是int,char還是string或者類),我們只用一個var就可以保存LINQ查詢到的結(jié)果。程序結(jié)果如下:

LINQ to SQL與NHibernate有什么不同

圖2.2 LINQ查詢數(shù)組程序結(jié)果

是不是很方便,LINQ的應(yīng)用遠(yuǎn)遠(yuǎn)不這些,通過不同的映射方案,我們可以實現(xiàn)對數(shù)據(jù)庫(LINQ To SQL),對XML文件(LINQ To XML)的訪問。

2.1.2 LINQ簡介

表2.1 LINQ的操作符

操作符

說明

聚合


Aggregate

對序列執(zhí)行一個自定義方法

Average

計算數(shù)值序列的平均值

Count

返回序列中的項目數(shù)(整數(shù))

LongCount

返回序列中的項目數(shù)(長型)

Min

查找數(shù)字序列中的最小數(shù)

Max

查找數(shù)字序列中的***數(shù)

Sum

匯總序列中的數(shù)字

連接


Concat

將兩個序列連成一個序列

轉(zhuǎn)換


Cast

將序列中的元素轉(zhuǎn)換成指定類型

OfType

篩選序列中指定類型的元素

ToArray

從序列返回一個數(shù)組

ToDictionary

從序列返回一個字典

ToList

從序列返回一個列表

ToLookup

從序列返回一個查詢

ToSequence

返回一個 IEnumerable 序列

元素


DefaultIfEmpty

為空序列創(chuàng)建默認(rèn)元素

ElementAt

返回序列中指定索引的元素

ElementAtOrDefault

返回序列中指定索引的元素,或者如果索引超出范圍,則返回默認(rèn)值

First

返回序列中的***個元素

FirstOrDefault

返回序列中的***個元素,或者如果未找到元素,則返回默認(rèn)值

Last

返回序列中的***一個元素

LastOrDefault

返回序列中的***一個元素,或者如果未找到元素,則返回默認(rèn)值

Single

返回序列中的單個元素

SingleOrDefault

返回序列中的單個元素,或者如果未找到元素,則返回默認(rèn)值

相等


SequenceEqual

比較兩個序列看其是否相等

生成


Empty

生成一個空序列

Range

生成一個指定范圍的序列

Repeat

通過將某個項目重復(fù)指定次數(shù)來生成一個序列

分組


GroupBy

按指定分組方法對序列中的項目進行分組

聯(lián)接


GroupJoin

通過歸組將兩個序列聯(lián)接在一起

Join

將兩個序列從內(nèi)部聯(lián)接起來

排序


OrderBy

以升序按值排列序列

OrderByDescending

以降序按值排列序列

ThenBy

升序排列已排序的序列

ThenByDescending

降序排列已排序的序列

Reverse

顛倒序列中項目的順序

分區(qū)


Skip

返回跳過指定數(shù)目項目的序列

SkipWhile

返回跳過不滿足表達式項目的序列

Take

返回具有指定數(shù)目項目的序列

TakeWhile

返回具有滿足表達式項目的序列

投影


Select

創(chuàng)建部分序列的投影

SelectMany

創(chuàng)建部分序列的一對多投影

限定符


All

確定序列中的所有項目是否滿足某個條件

Any

確定序列中是否有任何項目滿足條件

Contains

確定序列是否包含指定項目

限制


Where

篩選序列中的項目

設(shè)置


Distinct

返回?zé)o重復(fù)項目的序列

Except

返回代表兩個序列差集的序列

Intersect

返回代表兩個序列交集的序列

Union

返回代表兩個序列交集的序列

Lambda表達式

許多標(biāo)準(zhǔn)查詢操作符在對序列執(zhí)行運算時都使用 Func 委托來處理單個元素。Lambda 表達式可與標(biāo)準(zhǔn)查詢操作符結(jié)合使用以代表委托。lambda 表達式是創(chuàng)建委托實現(xiàn)的簡略表達形式,并可用于匿名委托適用的所有場合。C# 和 Visual Basic® .NET 均支持 Lambda 表達式。但是,必須注意:由于 Visual Basic .NET 尚不支持匿名方法,Lambda 表達式可能僅包含一個語句。

上例中的的程序等同于下面

LINQ to SQL與NHibernate有什么不同

圖2.3 Lambda表達式的使用

2.2 NHibernate

說到NHibernate,就不得不提Hibernate,原因很簡單,Hibernate顧名思義就是Hibernate的.NET版本。

Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,***革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。

NHibernate作為Hibernate的.NET應(yīng)用于Hibernate的實現(xiàn)完全相同,學(xué)習(xí)NHibernate完全可以直接學(xué)習(xí)Hibernate的資料。

事實上,雖然在Java數(shù)據(jù)庫映射領(lǐng)域Hibernate是使用最為廣泛的方案,但是在.NET中由于LINQ等映射方案(包括微軟下一代重量級的Entity Framework)的使用,NHibernate冷了許多。

NHibernate需要配置數(shù)據(jù)庫配置文件和類/表映射配置文件,所以使用NHibernate需要懂得XML文件的基礎(chǔ)知識,并且需要掌握比較復(fù)雜的XML文件配置節(jié)和相應(yīng)的配置命令。

2.2.1數(shù)據(jù)庫配置文件

NHibernate官方提供了配置文件的模板和實例可供我們參考。

LINQ to SQL與NHibernate有什么不同

圖2.4 NHibernate官方數(shù)據(jù)庫配置文件模板(對應(yīng)了不同的數(shù)據(jù)庫)

上圖為數(shù)據(jù)庫配置文件。通常以“cfg.xml”作為后綴,一個示例的文件內(nèi)容如下

LINQ to SQL與NHibernate有什么不同

圖2.5數(shù)據(jù)庫配置文件示例

下面是一些在運行時可以改變NHibernate行為的其他配置。所有這些都是可選的,也有合理的默認(rèn)值。

表2.2 NHibernate配置屬性

屬性名

用途

hibernate.dialect

NHibernate方言(Dialect)的類名 - 可以讓NHibernate使用某些特定的數(shù)據(jù)庫平臺的特性

例如:full.classname.of.Dialect(如果方言創(chuàng)建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一個自定義的方言的實現(xiàn),它不屬于NHibernate)。

hibernate.default_schema

在生成的SQL中,scheml/tablespace的全限定名.

例如:SCHEMA_NAME

hibernate.prepare_sql

是否準(zhǔn)備sql語句

例如:true | false

hibernate.session_factory_name

SessionFactory被創(chuàng)建后將自動綁定這個名稱.

例如:some.name

hibernate.use_outer_join

允許使用外連接抓取。

例如:true | false

hibernate.cache.provider_class

指定一個自定義的CacheProvider緩存提供者的類名

例如:full.classname.of.CacheProvider(如果ICacheProvider創(chuàng)建在NHibernate中), 或full.classname.of.CacheProvider, assembly(如果使用一個自定義的ICacheProvider,它不屬于NHibernate)。

hibernate.query.substitutions

把NHibernate查詢中的一些短語替換為SQL短語(比如說短語可能是函數(shù)或者字符)。

例如:hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

2.2.2實體映射配置文件

NHibernate官方開源包中提供了實體映射配置文件的實例可供我們參考。

LINQ to SQL與NHibernate有什么不同

圖2.6 NHibernate開源包中提供的實體映射配置文件

與數(shù)據(jù)庫配置文件一樣實體映射配置文件也是XML文件(XML果然是很強大啊,微軟下一代應(yīng)用程序開發(fā)技術(shù)WPF就是使用XML文件將C/S和B/S長期分居的二人統(tǒng)一到一個屋檐下),所不同的是實體映射配置文件后綴是“hbm.xml”。

LINQ to SQL與NHibernate有什么不同

圖2.7實體映射配置文件

實體映射配置文件所要配置的信息一般為

Ø Schema

所有的XML映射都需要使用nhibernate-mapping-2.0 schema。目前的schema可以在NHibernate的資源路徑或者是NHibernate.dll的嵌入資源(Embedded Resource)中找到。NHibernate總是會優(yōu)先使用嵌入在資源中的schema文件。

Ø hibernate-mapping

(1)

schema (可選): 數(shù)據(jù)庫schema名稱.

(2)

default-cascade (可選 - 默認(rèn)為 none): 默認(rèn)的級聯(lián)風(fēng)格.

(3)

auto-import (可選 - 默認(rèn)為 true): 指定是否我們可以在查詢語言中使用非全限定的類名(僅限于本映射文件中的類)。

(4)

default-access (可選 - 默認(rèn)為 property): NHibernate訪問屬性值時的策略。

(5)

assembly (可選): 指定一個程序集,如果在映射文檔中沒有指定程序集,就使用這個程序集。

(6)

namespace (可選): 指定一個命名空間前綴,如果在映射文檔中沒有指定全限定名,就使用這個命名空間名。

Ø class

(1)

name: 持久化類(或者接口)的全限定名。

(2)

table: 對應(yīng)的數(shù)據(jù)庫表名。

(3)

discriminator-value (可選 - 默認(rèn)和類名一樣): 一個用于區(qū)分不同的子類的值,在多態(tài)行為時使用。

(4)

mutable (可選, 默認(rèn)為 true): 表明該類的實例可變(不可變)。

(5)

schema (可選): 覆蓋在根元素中指定的schema名字。

(6)

proxy (可選): 指定一個接口,在延遲裝載時作為代理使用。你可以在這里使用該類自己的名字。

(7)

dynamic-update (可選, 默認(rèn)為 false): 指定用于UPDATE 的SQL將會在運行時動態(tài)生成,并且只更新那些改變過的字段。

(8)

dynamic-insert (可選, 默認(rèn)為 false): 指定用于INSERT的 SQL 將會在運行時動態(tài)生成,并且只包含那些非空值字段。

(9)

polymorphism (可選, 默認(rèn)為 implicit(隱式)): 界定是隱式還是顯式的使用查詢多態(tài)。

(10)

where (可選) 指定一個附加的SQL WHERE 條件,在抓取這個類的對象時會一直增加這個條件。

(11)

persister (可選): 指定一個定制的 IClassPersister.

(12)

lazy(可選):假若設(shè)置 lazy="true",就是設(shè)置這個類自己的名字作為proxy接口的一種等價快捷形式。

Ø id

(1)

name (可選): 標(biāo)識屬性的名字。

(2)

type (可選): 標(biāo)識NHibernate類型的名字。

(3)

column (可選 - 默認(rèn)為屬性名): 主鍵字段的名字。

(4)

unsaved-value (可選 - 默認(rèn)為 null): 一個特定的標(biāo)識屬性值,用來標(biāo)志該實例是剛剛創(chuàng)建的,尚未保存。這可以把這種實例和從以前的session中裝載過(可能又做過修改--譯者注)但未再次持久化的實例區(qū)分開來。

(5)

access (可選 - 默認(rèn)為 property): NHibernate用來訪問屬性值的策略。

除此之外我們可以通過其他途徑深入了解配置方面的知識,一個NHibernate項目,配置文件的錯誤往往導(dǎo)致錯誤的結(jié)果甚至使得程序無法運行。

感謝各位的閱讀,以上就是“LINQ to SQL與NHibernate有什么不同”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對LINQ to SQL與NHibernate有什么不同這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

本文標(biāo)題:LINQtoSQL與NHibernate有什么不同
網(wǎng)頁網(wǎng)址:http://jinyejixie.com/article6/iisgog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、建站公司標(biāo)簽優(yōu)化、定制開發(fā)、軟件開發(fā)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
岫岩| 吴桥县| 宁阳县| 平邑县| 天峻县| 达尔| 赤壁市| 丹棱县| 蒙阴县| 辽源市| 克拉玛依市| 大连市| 白玉县| 富蕴县| 青岛市| 广宗县| 平原县| 福泉市| 大安市| 慈利县| 团风县| 麻栗坡县| 万载县| 六安市| 信宜市| 金沙县| 特克斯县| 平湖市| 灵璧县| 四子王旗| 北安市| 宁夏| 稻城县| 陆丰市| 惠东县| 阜阳市| 东光县| 左贡县| 尚志市| 西和县| 辽阳市|