1. LINQ  TO SQL 和EF 特點(diǎn):  LINQ TO SQL和Entity Framework都是一種包含LINQ功能的ORM 也就是所謂的關(guān)系對(duì)象的映射。其中包括的有DBFrist  Code Frist    ModeL  Frist   三種中方式 來(lái)進(jìn)行和數(shù)據(jù)庫(kù)之間的訪問(wèn)。只是形式不同而已本質(zhì)沒(méi)有什么區(qū)別。都是ORM  之間的轉(zhuǎn)化。最終都是來(lái)進(jìn)行訪問(wèn)底層的數(shù)據(jù)庫(kù)的對(duì)象 和服務(wù)。

簡(jiǎn)單來(lái)說(shuō)LINQ是為了滿(mǎn)足不知道怎么操作數(shù)據(jù)庫(kù)的程序員開(kāi)發(fā)設(shè)計(jì)的,LinQ 可以讓他們以一種面向數(shù)據(jù)對(duì)象的方式來(lái)思考,及持久化他們的數(shù)據(jù)。 當(dāng)然最后來(lái)進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù)的無(wú)論是Oracle SQL Server  MySQL   MongoDB   DB2  等等 都是最終生成 SQL 語(yǔ)句來(lái)進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù)的 和傳統(tǒng)的ADO.NET 直接來(lái)訪問(wèn)數(shù)據(jù)庫(kù)沒(méi)有什么直接的區(qū)別,只是,MicroSoft  將其 CRUD 的一些方法進(jìn)行封裝了而已,讓開(kāi)發(fā)使用起來(lái)更加的方便  開(kāi)發(fā)的速度更加的快速 ,更加的專(zhuān)注于核心的業(yè)務(wù)的開(kāi)發(fā)的開(kāi)發(fā) ,而不是在為這些簡(jiǎn)單的操作而耽擱太多的時(shí)間??梢宰岄_(kāi)發(fā)節(jié)省更多的開(kāi)發(fā)的時(shí)間 去做更多的事情。

當(dāng)然你使用SQL Server  中的SQL Profile  來(lái)進(jìn)行 查看 其中生成的SQL , 那么問(wèn)題來(lái)了 如果Oracle  MySQL  DB2   MongoDB   如何進(jìn)行查看生成的SQL 語(yǔ)句 了。那么這個(gè)時(shí)候你需要進(jìn)行 使用nuGet 來(lái)進(jìn)行添加一個(gè)第三方的程序集。MiniProfiler.dll 來(lái)進(jìn)行查看生成的生成的SQL 語(yǔ)句  當(dāng)然關(guān)于如何使用 可以進(jìn)行參考 (http://www.cnblogs.com/jiekzou/p/6374726.html) 博客上面具有介紹我就不一一的說(shuō)了。其中 無(wú)論是LINQ TO SQL  還是 EF 最終的形式 都是通過(guò)DBContent  來(lái)進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù)。

LINQ  TO  SQL 和Entity Framework 兩者的本質(zhì)的區(qū)別:

EF對(duì)數(shù)據(jù)庫(kù)架構(gòu)和我們查詢(xún)的中實(shí)現(xiàn)更好的解耦。使用EF,我們查詢(xún)的對(duì)象不再是完全對(duì)應(yīng)數(shù)據(jù)庫(kù)架構(gòu)的C#類(lèi),而是更高層的抽象:Entity Data Model。這為我們提供了額外的靈活性其中在性能和簡(jiǎn)單性上面也會(huì)有所損失。 這個(gè)是必須的。 畢竟在解析中性能以及功能性都是有所損失的。

優(yōu)點(diǎn)LINQ TO SQL,是一個(gè)輕量級(jí)的ORM框架,為Microsoft SQL Server數(shù)據(jù)庫(kù)提供快速的應(yīng)用程序開(kāi)發(fā),其優(yōu)點(diǎn)是易于使用、簡(jiǎn)單、高性能。Entity Framework,為創(chuàng)建數(shù)據(jù)庫(kù)架構(gòu)和實(shí)體類(lèi)之間的映射提供了更好的靈活性,它還通過(guò)提供程序支持除了SQL Server之外的第三方數(shù)據(jù)庫(kù)。 例如其中的MySQL  Oracle  MongoDB  DB 2  等等 都是可以映射以及訪問(wèn)的。

EF  6.0 經(jīng)過(guò)Microsoft 的改進(jìn)性能相對(duì)于EF 4.0 確實(shí)提升了不少 其中對(duì)于CRUD 的訪問(wèn)。這意味著我們?cè)谙盗形恼轮械腖INQ  TO  DB 查詢(xún)可以同時(shí)適用于EF 4.0 以下的版本和L2S。而且,這也使得LINQ TO SQL  成為我們學(xué)習(xí)使用LINQ查詢(xún)數(shù)據(jù)庫(kù)的理想技術(shù), 因?yàn)楸3种鴮?duì)象和關(guān)系之間的映射的性 那么 在使用變得的非常的簡(jiǎn)單 以及靈活性,并且我們學(xué)習(xí)到的查詢(xún)?cè)瓌t和技術(shù)同樣適用于EF。

說(shuō)明:.NET 3.5下建議使用LINQ TO SQL ,該版本已經(jīng)完全支持成熟的LINQ;使用EF則建議使用.NET 4.0+(VS2010)以上的版本,該版本有成熟完整的EF       


LINQ TO SQL   

Entity Framework 4.0+

復(fù)雜度

相對(duì)不復(fù)雜

相對(duì)比較復(fù)雜

模型

域模型(DOMAIN MODEL)

概念數(shù)據(jù)模型(Conceptual DATA MODEL)

數(shù)據(jù)庫(kù)服務(wù)器

SQL Server

多種數(shù)據(jù)庫(kù)產(chǎn)品

開(kāi)發(fā)時(shí)間

快速應(yīng)用開(kāi)發(fā)

需要較長(zhǎng)時(shí)間,但支持更多特性

繼承

困難

容易

文件類(lèi)型

DBML文件

EDMX,CDSL,MSL,SSDL文件

復(fù)雜類(lèi)型支持

不支持

支持

查詢(xún)能力

通過(guò)DataContext

ESQL,對(duì)象服務(wù), Entity Client

性能

第一次查詢(xún)較慢(延遲加載)

第一次查詢(xún)也較慢(延遲加載),但總體優(yōu)與LINQ to SQL  對(duì)于復(fù)雜的數(shù)據(jù)類(lèi)型結(jié)合比較好

完善

不再出新版本

還出新版本目前已經(jīng)更新到EF 6.0+ 以上的版本

從模型生成數(shù)據(jù)庫(kù)

支持

支持 DBFrist  ModelFrist Code Frist 

2.LINQ  TO  SQL 和Entity Framework 復(fù)雜度:

 LINQ  TO  SQL 支持特性比較少一些;但是相對(duì)于EntityFramework支持的特性比較多,所以稍微比較復(fù)雜一些但是 兩者可以相互結(jié)合的使用。將其轉(zhuǎn)化集合 還是非常好使用的。沒(méi)必要將形式局限與  LINQ TO  SQL  還是其中的LAMBDA 表達(dá)式上賣(mài)弄

 LINQ TO SQL在數(shù)據(jù)表與類(lèi)之間提供了一對(duì)一的映射 和一對(duì)多之間的關(guān)系等等 當(dāng)然 你也可以進(jìn)行對(duì)于將對(duì)象直接作為查詢(xún)的條件進(jìn)行 查詢(xún)這樣的效率是非常的高的。

 LINQ  TO SQL只支持Microsoft SQL Server 2000及之后的版本當(dāng)然你選擇的數(shù)據(jù)庫(kù)版本高一些還是比較好的 畢竟高版本的數(shù)據(jù)庫(kù)使用起來(lái)無(wú)論是性能還是操作起來(lái)都是非常的方便的,但即使是SQLServer2000也有很多限制。EntityFramework可以支持DB2, MonogoDB, Oracle, MySQL還有其他的數(shù)據(jù)庫(kù)等等。

3.LINQ  TO  SQL 和Entity Framework開(kāi)發(fā)時(shí)間:

LINQ TO  SQL很容易學(xué),開(kāi)發(fā)起來(lái)也很快,但是LINQ TO SQL有一些限制,在開(kāi)發(fā)較復(fù)雜的應(yīng)用時(shí)可能會(huì)產(chǎn)生問(wèn)題。EntityFramework的能力更強(qiáng),雖然學(xué)習(xí)及應(yīng)用起來(lái)比較慢,但是對(duì)更多的特性的支持使得在開(kāi)發(fā)較復(fù)雜的應(yīng)用時(shí)可以使問(wèn)題最小化。當(dāng)然我建議一些初學(xué)者還是老老實(shí)實(shí)的 從ADO.NET 開(kāi)始進(jìn)行學(xué)起 ,畢竟 知道知其然然后知其所以然 這樣對(duì)于你寫(xiě)的Linq TO  SQL  還是 EF 都是幫助非常的大的。

4.LINQ  TO  SQL 和Entity Framework繼承:

 LINQ TO SQL支持TPH,而EntityFramework支持TPH和TPT,并且對(duì)TPC也部分支持。

5.LINQ  TO  SQL 和Entity Framework 文件類(lèi)型:

LINQ to SQL使用包含XML的數(shù)據(jù)庫(kù)標(biāo)記語(yǔ)言(DBML)文件來(lái)映射entity與數(shù)據(jù)表。EntityFramework 使用四個(gè)文件。第一個(gè)是Entity Data Model (EDMX),這個(gè)是在設(shè)計(jì)器中使用的。在編譯時(shí)EDMX文件產(chǎn)生了其他三個(gè)文件。另外三個(gè)文件中,第一個(gè)是ConceptualSchema Definition Language(CSDL)文件,其包含概念模型的XML定義。第二個(gè)是SchemaDefinition Language(SSDL)文件,其包含存儲(chǔ)模型的定義。第三個(gè)文件是Mapping Specification Language(MSL)文件,其包含概念模型與存儲(chǔ)模型之間的映射。

6.LINQ  TO  SQL 和Entity Framework 復(fù)雜類(lèi)型的變化:

比如說(shuō),我們遇到一些復(fù)雜的表格進(jìn)行關(guān)聯(lián)的時(shí)候。LINQ  TO  SQL不支持這種復(fù)雜類(lèi)型,而EntityFramework支持。但是我們遇到這樣的問(wèn)題的時(shí)候可以通過(guò)將EF 結(jié)合到 LINQ TO  SQL  集合來(lái)進(jìn)行查詢(xún) 并進(jìn)行 處理就可以了。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 1 //例如下面進(jìn)行查詢(xún)過(guò)和訂單相互關(guān)聯(lián)的數(shù)據(jù)集合 2  3  var AccountList = (from u in StarList.Where(u => u.FUST_LEVEL == 3).ToList() 4  5  join p in MyDataContexter.fa_brokerage_bill_table.Where(p => p.FBBT_TIME.Year == date.Year && p.FBBT_TIME.Month == date.Month && p.FBBT_STATE != 0).ToList() on u.FUST_ID equals p.FBBT_FUST_ID 6  7 orderby p.FBBT_CREATETIME descending 8 select new AccountInfo 9 {10 Flag = u.FUST_LEVEL,11 UserImg = AliyunRoot+u.FUST_HEADIMAGE,12 UserName = u.FUST_REALNAME != "" ?( u.FUST_REALNAME.Length > 3 ? u.FUST_NICKNAME.Substring(0, 3) + "..." : u.FUST_NICKNAME) : (u.FUST_NICKNAME.Length > 3 ? u.FUST_NICKNAME.Substring(0, 3) + "..." : u.FUST_NICKNAME),13 Income = p.FBBT_BIGSTAR_MONEY.ToString("N2") ?? "0.00",14 ShowIncome = p.FBBT_BIGSTAR_MONEY,15 StarID = u.FUST_ID,16 StarLevel = u.FUST_LEVEL,17 JoinTime = u.FUST_JOINTIME.ToString("yyyy-MM-dd")18 }).ToList();

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

7.LINQ  TO  SQL 和Entity Framework 查詢(xún)的速度和能力:

LINQ TO SQL通過(guò)DataContext對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)。EntityFramework通過(guò)ObjectContext通過(guò)LINQ TO  ENTITY 進(jìn)行查詢(xún)。Entity Framework還提供了EDMX SQL,它是一種類(lèi)似SQL的查詢(xún)語(yǔ)言,很適合在模型定義中定義查詢(xún)。EntityFramework還包含了 ObjectQuery類(lèi),用于對(duì)象服務(wù)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建查詢(xún)。最后EntityFramework還包含EntityClientProvider,它 用于對(duì)概念模型進(jìn)行查詢(xún)。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

 1 // 查詢(xún)銷(xiāo)售記錄 2 var QWXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 2) 3 where s.FUST_LEVEL_ID == strUserID 4 join a in MyDataContexter.fa_brokerage_sales_table on s.FUST_ID equals a.FBPT_FUST_ID 5 group a by a.FBPT_FUST_ID into g 6 select new 7 { 8 g.Key, 9 ZCount = g.Count(),10 ZMoney = g.Sum(p => p.FBPT_MONEY)11 }).ToList();12 // 查詢(xún)訂單記錄13 var QXXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 3)14 where s.FUST_RECOMMEND_ID == strUserID15 join b in MyDataContexter.fa_brokerage_sales_table16 on s.FUST_ID equals b.FBPT_BUY_FUST_ID17 group b by b.FBPT_BUY_FUST_ID into g18 select new19 {20 g.Key,21 ZCount = g.Count(),22 ZMoney = g.Sum(p => p.FBPT_MONEY)23 }).ToList();24 // 聯(lián)合一下25 var QuerList = (from z in (from s in QWXery select s).Union(26 from a in QXXery select a)27 select new OrderList28 {29 ID = z.Key,30 GCount = z.ZCount,31 HJMoney = z.ZMoney32 }).ToList();33 return QuerList;34 }35 else36 {37 // 查詢(xún)星星就可以了38 var QXXery = (from s in XZUser39 where s.FUST_RECOMMEND_ID == strUserID40 join b in MyDataContexter.fa_brokerage_sales_table41 on s.FUST_ID equals b.FBPT_BUY_FUST_ID42 group b by b.FBPT_BUY_FUST_ID into g43 select new OrderList44 {45 ID = g.Key,46 GCount = g.Count(),47 HJMoney = g.Sum(p => p.FBPT_MONEY)48 }).ToList();49 50 return QXXery;51 }

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

8.LINQ  TO  SQL 和Entity Framework  性能:

LINQ  TO  SQL和Entity Framework 在第一次進(jìn)行比較緩慢 這個(gè)由于進(jìn)行訪問(wèn) 數(shù)據(jù)從而 在解析以及讀取數(shù)據(jù)等等 速度并不讓人滿(mǎn)意,但是只有在進(jìn)行請(qǐng)求 訪問(wèn)的時(shí)候速度就比較快了 因?yàn)長(zhǎng)INQ TO SQL  和EF  都涉及到一個(gè)延遲加載的問(wèn)題 第二次加載后由于讀取的數(shù)據(jù)早已放入 緩存 中 速度還是讓人滿(mǎn)意的 所以開(kāi)發(fā)以及用戶(hù)200W 以?xún)?nèi)的數(shù)據(jù)的數(shù)據(jù) 就沒(méi)有必要去考慮這些性能的問(wèn)題, 畢竟EF 6.0對(duì)于EntityFramework 做了很大的優(yōu)化性能要稍微優(yōu)于LINQ TO  SQL。 還是非常值得使用的。  如果對(duì)于并發(fā)可以考慮采用事務(wù)或者LOCK 來(lái)進(jìn)行處理這些問(wèn)題。 如果真是數(shù)據(jù)量非常的大那么查詢(xún)過(guò)的結(jié)構(gòu)足夠的復(fù)雜,那么 采用存儲(chǔ)過(guò)程 來(lái)做倒是還不錯(cuò)的。LINQ TO SQL  存儲(chǔ)過(guò)程  EF  存儲(chǔ)過(guò)程 來(lái)做 。倒是挺好的。

9.LINQ  TO  SQL 和Entity Framework  優(yōu)化的處理:

一直有人對(duì)于 EF 和   LINQ  TO  SQL  的性能的問(wèn)題存在很大的質(zhì)疑 當(dāng)然 這個(gè)是必須的。對(duì)于我們寫(xiě)的 LINQ  語(yǔ)句 以及 LAMBDA  的時(shí)候需要注意 就是了 理清楚表之間的關(guān)系 以及各個(gè)對(duì)象之間的關(guān)系,做到優(yōu)化的查詢(xún) 等等。具體如果做 我抽時(shí)間在寫(xiě)關(guān)于如何優(yōu)化LINQ   表達(dá)式以及 LAMBDA  表達(dá)式做法。

 

                                                                                 以上內(nèi)容 全部屬于原創(chuàng)! 部分觀點(diǎn) 引用 了維基百科 和其他博客觀點(diǎn) 已經(jīng)聲明!    2017/7/5  00:23:35   

 

再牛逼的夢(mèng)想,也抵不住我傻逼似的堅(jiān)持!別在該奮斗的年紀(jì),貪圖安逸。 今天多學(xué)一些知識(shí),明天開(kāi)發(fā)的速度就更快一下。后天你就會(huì)變得更好。

http://www.cnblogs.com/LowKeyCXY/p/7121850.html