LINQ TO SQL和Entity Framework 的关系 你了解多少?
1. LINQ ?TO SQL 和EF 特點(diǎn):??LINQ TO SQL和Entity Framework都是一種包含LINQ功能的ORM 也就是所謂的關(guān)系對象的映射。其中包括的有DBFrist ?Code Frist ? ?ModeL ?Frist ? 三種中方式 來進(jìn)行和數(shù)據(jù)庫之間的訪問。只是形式不同而已本質(zhì)沒有什么區(qū)別。都是ORM ?之間的轉(zhuǎn)化。最終都是來進(jìn)行訪問底層的數(shù)據(jù)庫的對象 和服務(wù)。
簡單來說LINQ是為了滿足不知道怎么操作數(shù)據(jù)庫的程序員開發(fā)設(shè)計(jì)的,LinQ 可以讓他們以一種面向數(shù)據(jù)對象的方式來思考,及持久化他們的數(shù)據(jù)。 當(dāng)然最后來進(jìn)行訪問數(shù)據(jù)庫的無論是Oracle SQL Server ?MySQL ? MongoDB ? DB2 ?等等 都是最終生成 SQL 語句來進(jìn)行訪問數(shù)據(jù)庫的 和傳統(tǒng)的ADO.NET 直接來訪問數(shù)據(jù)庫沒有什么直接的區(qū)別,只是,MicroSoft ?將其 CRUD 的一些方法進(jìn)行封裝了而已,讓開發(fā)使用起來更加的方便 ?開發(fā)的速度更加的快速 ,更加的專注于核心的業(yè)務(wù)的開發(fā)的開發(fā) ,而不是在為這些簡單的操作而耽擱太多的時間。可以讓開發(fā)節(jié)省更多的開發(fā)的時間 去做更多的事情。
當(dāng)然你使用SQL Server ?中的SQL Profile ?來進(jìn)行 查看 其中生成的SQL , 那么問題來了 如果Oracle ?MySQL ?DB2?? MongoDB ? 如何進(jìn)行查看生成的SQL 語句 了。那么這個時候你需要進(jìn)行 使用nuGet 來進(jìn)行添加一個第三方的程序集。MiniProfiler.dll 來進(jìn)行查看生成的生成的SQL 語句 ?當(dāng)然關(guān)于如何使用 可以進(jìn)行參考 (http://www.cnblogs.com/jiekzou/p/6374726.html) 博客上面具有介紹我就不一一的說了。其中 無論是LINQ TO SQL ?還是 EF 最終的形式 都是通過DBContent ?來進(jìn)行訪問數(shù)據(jù)庫。
LINQ ?TO ?SQL 和Entity Framework 兩者的本質(zhì)的區(qū)別:
EF對數(shù)據(jù)庫架構(gòu)和我們查詢的中實(shí)現(xiàn)更好的解耦。使用EF,我們查詢的對象不再是完全對應(yīng)數(shù)據(jù)庫架構(gòu)的C#類,而是更高層的抽象:Entity Data Model。這為我們提供了額外的靈活性其中在性能和簡單性上面也會有所損失。 這個是必須的。 畢竟在解析中性能以及功能性都是有所損失的。
優(yōu)點(diǎn):LINQ TO SQL,是一個輕量級的ORM框架,為Microsoft SQL Server數(shù)據(jù)庫提供快速的應(yīng)用程序開發(fā),其優(yōu)點(diǎn)是易于使用、簡單、高性能。Entity Framework,為創(chuàng)建數(shù)據(jù)庫架構(gòu)和實(shí)體類之間的映射提供了更好的靈活性,它還通過提供程序支持除了SQL Server之外的第三方數(shù)據(jù)庫。 例如其中的MySQL ?Oracle ?MongoDB ?DB 2 ?等等 都是可以映射以及訪問的。
EF ?6.0 經(jīng)過Microsoft 的改進(jìn)性能相對于EF 4.0 確實(shí)提升了不少 其中對于CRUD 的訪問。這意味著我們在系列文章中的LINQ ?TO ?DB 查詢可以同時適用于EF 4.0 以下的版本和L2S。而且,這也使得LINQ TO SQL ?成為我們學(xué)習(xí)使用LINQ查詢數(shù)據(jù)庫的理想技術(shù), 因?yàn)楸3种鴮ο蠛完P(guān)系之間的映射的性 那么 在使用變得的非常的簡單 以及靈活性,并且我們學(xué)習(xí)到的查詢原則和技術(shù)同樣適用于EF。
說明:.NET 3.5下建議使用LINQ TO SQL ,該版本已經(jīng)完全支持成熟的LINQ;使用EF則建議使用.NET 4.0+(VS2010)以上的版本,該版本有成熟完整的EF ? ? ??
| ? | LINQ TO SQL ?? | Entity Framework 4.0+ |
| 復(fù)雜度 | 相對不復(fù)雜 | 相對比較復(fù)雜 |
| 模型 | 域模型(DOMAIN MODEL) | 概念數(shù)據(jù)模型(Conceptual DATA MODEL) |
| 數(shù)據(jù)庫服務(wù)器 | SQL Server | 多種數(shù)據(jù)庫產(chǎn)品 |
| 開發(fā)時間 | 快速應(yīng)用開發(fā) | 需要較長時間,但支持更多特性 |
| 繼承 | 困難 | 容易 |
| 文件類型 | DBML文件 | EDMX,CDSL,MSL,SSDL文件 |
| 復(fù)雜類型支持 | 不支持 | 支持 |
| 查詢能力 | 通過DataContext | ESQL,對象服務(wù), Entity Client |
| 性能 | 第一次查詢較慢(延遲加載) | 第一次查詢也較慢(延遲加載),但總體優(yōu)與LINQ to SQL ?對于復(fù)雜的數(shù)據(jù)類型結(jié)合比較好 |
| 完善 | 不再出新版本 | 還出新版本目前已經(jīng)更新到EF 6.0+ 以上的版本 |
| 從模型生成數(shù)據(jù)庫 | 支持 | 支持 DBFrist ?ModelFrist Code Frist? |
2.LINQ ?TO ?SQL 和Entity Framework?復(fù)雜度:
?LINQ ?TO ?SQL 支持特性比較少一些;但是相對于EntityFramework支持的特性比較多,所以稍微比較復(fù)雜一些但是 兩者可以相互結(jié)合的使用。將其轉(zhuǎn)化集合 還是非常好使用的。沒必要將形式局限與 ?LINQ TO ?SQL ?還是其中的LAMBDA 表達(dá)式上賣弄
?LINQ TO SQL在數(shù)據(jù)表與類之間提供了一對一的映射 和一對多之間的關(guān)系等等 當(dāng)然 你也可以進(jìn)行對于將對象直接作為查詢的條件進(jìn)行 查詢這樣的效率是非常的高的。
?LINQ ?TO SQL只支持Microsoft SQL Server 2000及之后的版本當(dāng)然你選擇的數(shù)據(jù)庫版本高一些還是比較好的 畢竟高版本的數(shù)據(jù)庫使用起來無論是性能還是操作起來都是非常的方便的,但即使是SQLServer2000也有很多限制。EntityFramework可以支持DB2, MonogoDB, Oracle, MySQL還有其他的數(shù)據(jù)庫等等。
3.LINQ ?TO ?SQL 和Entity Framework開發(fā)時間:
LINQ TO ?SQL很容易學(xué),開發(fā)起來也很快,但是LINQ TO SQL有一些限制,在開發(fā)較復(fù)雜的應(yīng)用時可能會產(chǎn)生問題。EntityFramework的能力更強(qiáng),雖然學(xué)習(xí)及應(yīng)用起來比較慢,但是對更多的特性的支持使得在開發(fā)較復(fù)雜的應(yīng)用時可以使問題最小化。當(dāng)然我建議一些初學(xué)者還是老老實(shí)實(shí)的 從ADO.NET 開始進(jìn)行學(xué)起 ,畢竟 知道知其然然后知其所以然 這樣對于你寫的Linq TO ?SQL ?還是 EF 都是幫助非常的大的。
4.LINQ ?TO ?SQL 和Entity Framework繼承:
?LINQ TO SQL支持TPH,而EntityFramework支持TPH和TPT,并且對TPC也部分支持。
5.LINQ ?TO ?SQL 和Entity Framework?文件類型:
LINQ to SQL使用包含XML的數(shù)據(jù)庫標(biāo)記語言(DBML)文件來映射entity與數(shù)據(jù)表。EntityFramework 使用四個文件。第一個是Entity Data Model (EDMX),這個是在設(shè)計(jì)器中使用的。在編譯時EDMX文件產(chǎn)生了其他三個文件。另外三個文件中,第一個是ConceptualSchema Definition Language(CSDL)文件,其包含概念模型的XML定義。第二個是SchemaDefinition Language(SSDL)文件,其包含存儲模型的定義。第三個文件是Mapping Specification Language(MSL)文件,其包含概念模型與存儲模型之間的映射。
6.LINQ ?TO ?SQL 和Entity Framework?復(fù)雜類型的變化:
比如說,我們遇到一些復(fù)雜的表格進(jìn)行關(guān)聯(lián)的時候。LINQ ?TO ?SQL不支持這種復(fù)雜類型,而EntityFramework支持。但是我們遇到這樣的問題的時候可以通過將EF 結(jié)合到 LINQ TO ?SQL ?集合來進(jìn)行查詢 并進(jìn)行 處理就可以了。
?
1 //例如下面進(jìn)行查詢過和訂單相互關(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_ID6 7 orderby p.FBBT_CREATETIME descending8 select new AccountInfo9 { 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?查詢的速度和能力:
LINQ TO SQL通過DataContext對數(shù)據(jù)庫進(jìn)行查詢。EntityFramework通過ObjectContext通過LINQ TO ?ENTITY 進(jìn)行查詢。Entity Framework還提供了EDMX SQL,它是一種類似SQL的查詢語言,很適合在模型定義中定義查詢。EntityFramework還包含了 ObjectQuery類,用于對象服務(wù)在運(yùn)行時動態(tài)創(chuàng)建查詢。最后EntityFramework還包含EntityClientProvider,它 用于對概念模型進(jìn)行查詢。
?
1 // 查詢銷售記錄2 var QWXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 2)3 where s.FUST_LEVEL_ID == strUserID4 join a in MyDataContexter.fa_brokerage_sales_table on s.FUST_ID equals a.FBPT_FUST_ID5 group a by a.FBPT_FUST_ID into g6 select new7 {8 g.Key,9 ZCount = g.Count(), 10 ZMoney = g.Sum(p => p.FBPT_MONEY) 11 }).ToList(); 12 // 查詢訂單記錄 13 var QXXery = (from s in XZUser.Where(e => e.FUST_LEVEL == 3) 14 where s.FUST_RECOMMEND_ID == strUserID 15 join b in MyDataContexter.fa_brokerage_sales_table 16 on s.FUST_ID equals b.FBPT_BUY_FUST_ID 17 group b by b.FBPT_BUY_FUST_ID into g 18 select new 19 { 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 OrderList 28 { 29 ID = z.Key, 30 GCount = z.ZCount, 31 HJMoney = z.ZMoney 32 }).ToList(); 33 return QuerList; 34 } 35 else 36 { 37 // 查詢星星就可以了 38 var QXXery = (from s in XZUser 39 where s.FUST_RECOMMEND_ID == strUserID 40 join b in MyDataContexter.fa_brokerage_sales_table 41 on s.FUST_ID equals b.FBPT_BUY_FUST_ID 42 group b by b.FBPT_BUY_FUST_ID into g 43 select new OrderList 44 { 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)行比較緩慢 這個由于進(jìn)行訪問 數(shù)據(jù)從而 在解析以及讀取數(shù)據(jù)等等 速度并不讓人滿意,但是只有在進(jìn)行請求 訪問的時候速度就比較快了 因?yàn)長INQ TO SQL ?和EF ?都涉及到一個延遲加載的問題 第二次加載后由于讀取的數(shù)據(jù)早已放入 緩存 中 速度還是讓人滿意的 所以開發(fā)以及用戶200W 以內(nèi)的數(shù)據(jù)的數(shù)據(jù) 就沒有必要去考慮這些性能的問題, 畢竟EF 6.0對于EntityFramework 做了很大的優(yōu)化性能要稍微優(yōu)于LINQ TO ?SQL。 還是非常值得使用的。 ?如果對于并發(fā)可以考慮采用事務(wù)或者LOCK 來進(jìn)行處理這些問題。 如果真是數(shù)據(jù)量非常的大那么查詢過的結(jié)構(gòu)足夠的復(fù)雜,那么 采用存儲過程 來做倒是還不錯的。LINQ TO SQL ?存儲過程 ?EF ?存儲過程 來做 。倒是挺好的。
9.LINQ ?TO ?SQL 和Entity Framework ?優(yōu)化的處理:
一直有人對于 EF 和 ??LINQ ?TO ?SQL ?的性能的問題存在很大的質(zhì)疑 當(dāng)然 這個是必須的。對于我們寫的 LINQ ?語句 以及 LAMBDA ?的時候需要注意 就是了 理清楚表之間的關(guān)系 以及各個對象之間的關(guān)系,做到優(yōu)化的查詢 等等。具體如果做 我抽時間在寫關(guān)于如何優(yōu)化LINQ ? 表達(dá)式以及 LAMBDA ?表達(dá)式做法。
總結(jié)
以上是生活随笔為你收集整理的LINQ TO SQL和Entity Framework 的关系 你了解多少?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新东方股价一周涨6倍!俞敏洪5月提示买入
- 下一篇: sql server 数据库忘记sa账户