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)行 處理就可以了。
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();
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)。
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 }
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