1. LINQ TO SQL 和EF 特色: LINQ TO SQL和Entity Framework都是一種包含LINQ功能的ORM 也就是所謂的關係對象的映射。其中包括的有DBFrist Code Frist ModeL Frist 三種中方式 來進行和數據庫之間的訪問。只是形式不一樣而已本質沒有什麼區別。都是ORM 之間的轉化。最終都是來進行訪問底層的數據庫的對象 和服務。html
簡單來講LINQ是爲了知足不知道怎麼操做數據庫的程序員開發設計的,LinQ 可讓他們以一種面向數據對象的方式來思考,及持久化他們的數據。 固然最後來進行訪問數據庫的不管是Oracle SQL Server MySQL MongoDB DB2 等等 都是最終生成 SQL 語句來進行訪問數據庫的 和傳統的ADO.NET 直接來訪問數據庫沒有什麼直接的區別,只是,MicroSoft 將其 CRUD 的一些方法進行封裝了而已,讓開發使用起來更加的方便 開發的速度更加的快速 ,更加的專一於核心的業務的開發的開發 ,而不是在爲這些簡單的操做而耽擱太多的時間。可讓開發節省更多的開發的時間 去作更多的事情。程序員
固然你使用SQL Server 中的SQL Profile 來進行 查看 其中生成的SQL , 那麼問題來了 若是Oracle MySQL DB2 MongoDB 如何進行查看生成的SQL 語句 了。那麼這個時候你須要進行 使用nuGet 來進行添加一個第三方的程序集。MiniProfiler.dll 來進行查看生成的生成的SQL 語句 固然關於如何使用 能夠進行參考 (http://www.cnblogs.com/jiekzou/p/6374726.html) 博客上面具備介紹我就不一一的說了。其中 不管是LINQ TO SQL 仍是 EF 最終的形式 都是經過DBContent 來進行訪問數據庫。數據庫
LINQ TO SQL 和Entity Framework 二者的本質的區別:緩存
EF對數據庫架構和咱們查詢的中實現更好的解耦。使用EF,咱們查詢的對象再也不是徹底對應數據庫架構的C#類,而是更高層的抽象:Entity Data Model。這爲咱們提供了額外的靈活性其中在性能和簡單性上面也會有所損失。 這個是必須的。 畢竟在解析中性能以及功能性都是有所損失的。服務器
優勢:LINQ TO SQL,是一個輕量級的ORM框架,爲Microsoft SQL Server數據庫提供快速的應用程序開發,其優勢是易於使用、簡單、高性能。Entity Framework,爲建立數據庫架構和實體類之間的映射提供了更好的靈活性,它還經過提供程序支持除了SQL Server以外的第三方數據庫。 例如其中的MySQL Oracle MongoDB DB 2 等等 都是能夠映射以及訪問的。架構
EF 6.0 通過Microsoft 的改進性能相對於EF 4.0 確實提高了很多 其中對於CRUD 的訪問。這意味着咱們在系列文章中的LINQ TO DB 查詢能夠同時適用於EF 4.0 如下的版本和L2S。並且,這也使得LINQ TO SQL 成爲咱們學習使用LINQ查詢數據庫的理想技術, 由於保持着對象和關係之間的映射的性 那麼 在使用變得的很是的簡單 以及靈活性,而且咱們學習到的查詢原則和技術一樣適用於EF。
說明:.NET 3.5下建議使用LINQ TO SQL ,該版本已經徹底支持成熟的LINQ;使用EF則建議使用.NET 4.0+(VS2010)以上的版本,該版本有成熟完整的EF 併發
|
LINQ TO SQL app |
Entity Framework 4.0+框架 |
複雜度ide |
相對不復雜 |
相對比較複雜 |
模型 |
域模型(DOMAIN MODEL) |
概念數據模型(Conceptual DATA MODEL) |
數據庫服務器 |
SQL Server |
多種數據庫產品 |
開發時間 |
快速應用開發 |
須要較長時間,但支持更多特性 |
繼承 |
困難 |
容易 |
文件類型 |
DBML文件 |
EDMX,CDSL,MSL,SSDL文件 |
複雜類型支持 |
不支持 |
支持 |
查詢能力 |
經過DataContext |
ESQL,對象服務, Entity Client |
性能 |
第一次查詢較慢(延遲加載) |
第一次查詢也較慢(延遲加載),但整體優與LINQ to SQL 對於複雜的數據類型結合比較好 |
完善 |
再也不出新版本 |
還出新版本目前已經更新到EF 6.0+ 以上的版本 |
從模型生成數據庫 |
支持 |
支持 DBFrist ModelFrist Code Frist |
2.LINQ TO SQL 和Entity Framework 複雜度:
LINQ TO SQL 支持特性比較少一些;可是相對於EntityFramework支持的特性比較多,因此稍微比較複雜一些可是 二者能夠相互結合的使用。將其轉化集合 仍是很是好使用的。不必將形式侷限與 LINQ TO SQL 仍是其中的LAMBDA 表達式上賣弄
LINQ TO SQL在數據表與類之間提供了一對一的映射 和一對多之間的關係等等 固然 你也能夠進行對於將對象直接做爲查詢的條件進行 查詢這樣的效率是很是的高的。
LINQ TO SQL只支持Microsoft SQL Server 2000及以後的版本固然你選擇的數據庫版本高一些仍是比較好的 畢竟高版本的數據庫使用起來不管是性能仍是操做起來都是很是的方便的,但即便是SQLServer2000也有不少限制。EntityFramework能夠支持DB2, MonogoDB, Oracle, MySQL還有其餘的數據庫等等。
3.LINQ TO SQL 和Entity Framework開發時間:
LINQ TO SQL很容易學,開發起來也很快,可是LINQ TO SQL有一些限制,在開發較複雜的應用時可能會產生問題。EntityFramework的能力更強,雖然學習及應用起來比較慢,可是對更多的特性的支持使得在開發較複雜的應用時可使問題最小化。固然我建議一些初學者仍是老老實實的 從ADO.NET 開始進行學起 ,畢竟 知道知其然而後知其因此然 這樣對於你寫的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的數據庫標記語言(DBML)文件來映射entity與數據表。EntityFramework 使用四個文件。第一個是Entity Data Model (EDMX),這個是在設計器中使用的。在編譯時EDMX文件產生了其餘三個文件。另外三個文件中,第一個是ConceptualSchema Definition Language(CSDL)文件,其包含概念模型的XML定義。第二個是SchemaDefinition Language(SSDL)文件,其包含存儲模型的定義。第三個文件是Mapping Specification Language(MSL)文件,其包含概念模型與存儲模型之間的映射。
6.LINQ TO SQL 和Entity Framework 複雜類型的變化:
好比說,咱們遇到一些複雜的表格進行關聯的時候。LINQ TO SQL不支持這種複雜類型,而EntityFramework支持。可是咱們遇到這樣的問題的時候能夠經過將EF 結合到 LINQ TO SQL 集合來進行查詢 並進行 處理就能夠了。
1 //例以下面進行查詢過和訂單相互關聯的數據集合
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 查詢的速度和能力:
LINQ TO SQL經過DataContext對數據庫進行查詢。EntityFramework經過ObjectContext經過LINQ TO ENTITY 進行查詢。Entity Framework還提供了EDMX SQL,它是一種相似SQL的查詢語言,很適合在模型定義中定義查詢。EntityFramework還包含了 ObjectQuery類,用於對象服務在運行時動態建立查詢。最後EntityFramework還包含EntityClientProvider,它 用於對概念模型進行查詢。
1 // 查詢銷售記錄
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 // 查詢訂單記錄
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 // 聯合一下
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 在第一次進行比較緩慢 這個因爲進行訪問 數據從而 在解析以及讀取數據等等 速度並不讓人滿意,可是隻有在進行請求 訪問的時候速度就比較快了 由於LINQ TO SQL 和EF 都涉及到一個延遲加載的問題 第二次加載後因爲讀取的數據早已放入 緩存 中 速度仍是讓人滿意的 因此開發以及用戶200W 之內的數據的數據 就沒有必要去考慮這些性能的問題, 畢竟EF 6.0對於EntityFramework 作了很大的優化性能要稍微優於LINQ TO SQL。 仍是很是值得使用的。 若是對於併發能夠考慮採用事務或者LOCK 來進行處理這些問題。 若是真是數據量很是的大那麼查詢過的結構足夠的複雜,那麼 採用存儲過程 來作卻是還不錯的。LINQ TO SQL 存儲過程 EF 存儲過程 來作 。卻是挺好的。
9.LINQ TO SQL 和Entity Framework 優化的處理:
一直有人對於 EF 和 LINQ TO SQL 的性能的問題存在很大的質疑 固然 這個是必須的。對於咱們寫的 LINQ 語句 以及 LAMBDA 的時候須要注意 就是了 理清楚表之間的關係 以及各個對象之間的關係,作到優化的查詢 等等。具體若是作 我抽時間在寫關於如何優化LINQ 表達式以及 LAMBDA 表達式作法。
以上內容 所有屬於原創! 部分觀點 引用 了維基百科 和其餘博客觀點 已經聲明! 2017/7/5 00:23:35