簡體   English   中英

Linq對SQL有什么問題?

[英]What's wrong with Linq to SQL?

Linq對SQL有什么問題?

或者 - Linq to SQL會使它不適合新項目或現有項目嗎? 我想知道為什么你為某個特定項目選擇Linq to SQL - 包括哪些項目參數使它不合適。

它不太適合數據庫模式的更改。 您必須重建dbml層並重新生成數據上下文。

像任何ORM一樣(我不會討論它是否是ORM),你必須要知道正在生成什么SQL,以及它將如何影響你的調用。

插件不是批量生產的,因此性能成本很高。

它正在落后於實體框架

盡管它使用的提供程序模型允許為其他DBMS平台構建提供程序,但只支持SQL Server。

[ 編輯 @AugustLights - 根據我的經驗:]延遲加載可能需要一些黑客才能開始工作。

話雖如此,我認為如果使用得當它非常方便

對於需要使用SQL Server以外的數據庫的項目:

1)您被鎖定使用SQL Server

對於具有復雜實體關系和/或隨時間逐漸變化的關系的項目:

2)您被鎖定為表到類的一對一映射

對於必須使用1.x版.NET的項目

3)不適用於.NET 1.x.

  • 沒有辦法在datacontext上混合使用延遲加載/預加載。
  • 真正的堅持無知是非常困難的。
  • 映射選項有限。 例如,沒有多對多的關系。
  • 使用模式更改重新同步映射非常痛苦。

盡管如此,我認為linq-to-sql是許多項目的絕佳選擇。

由於System.Data.Linq.DataContext類缺少接口,因此在單元測試時很難進行模擬。 這是一種可能的方法:將LINQ模擬為SQL DataContext

因為你沒有使用3.5 ...這是一個有效的答案嗎?!?!?

好吧,我已經使用LINQ to SQL開發了一些應用程序。 我發現的一個主要問題是必須分層你的應用程序。 在LINQ to SQL中,實體類與數據訪問代碼緊密相關。 此外,DataContext存在一些問題,這意味着您可以使用DataContext對象來檢索項目,但不能將項目(對象)傳輸到另一個DataContext(至少不容易)。

如果您不關心正確分層應用程序,並且如果您想要的是快速創建應用程序(也稱為RAPID應用程序開發),LINQ to SQL將非常有用。

LINQ-to-SQL的許多優點來自於基於dbml中強類型可查詢/可枚舉數據對象(它扮演非常有限的DAL的角色),可以在代碼隱藏中構建數據查詢。 。 因此,正如已經提到的那樣,結果是它鼓勵您在某種程度上在您的應用程序之外的強定義和分離的層或層之外進行游戲。
為了反駁這一點,它應該意味着你應該能夠消除你在數據庫中寫入存儲過程的大部分或全部業務邏輯,所以至少你只需要去處理數據的代碼更改非模式影響業務規則...但是,當您意識到使用帶有分組的聚合的外部聯接編寫查詢時會有多么復雜,至少在您第一次接近時是這樣。 所以你很想在SQL中編寫sprocs,你知道這樣做很簡單,很擅長做這些事情,而不是花費額外的時間來試圖找出LINQ語法來做同樣的事情,當它只是轉換它時無論如何要丑陋的SQL代碼......
話雖如此,我真的很喜歡LINQ,當我開始忽略這種“查詢語法更容易閱讀”的情緒時,我對它的尊重大大增加了我看到的情緒,我已經看到了並且切換到方法語法。 永不回頭。

我唯一要標記為技術“showstopper”的是你想要使用其他RDBMS而不是SQL Server。 (雖然它可以解決 - 見Matt Warren的博客@ http://blogs.msdn.com/mattwar/

除此之外,您的問題的先前答案中已經列出了一些優點和缺點。 但是,到目前為止提到的所有負面結果都有變通方法,所以它們並不是真正的顯示器。

非技術性[潛在] showstopper是MSFT放棄它而支持EF的風險......更多關於這一點: http//oakleafblog.blogspot.com/2008/05/is-adonet-team-abandoning- LINQ到sql.html

雖然(在我看來),EF的當前狀態足以讓他們繼續在L2S上工作。 所以我們希望他們這樣做......

真正的ORM應該將業務實體的設計與持久性介質分開。 這樣你就可以分別重構其中任何一個,只需要維護兩者之間的映射。 這減少了為數據庫更改而需要維護的應用程序邏輯代碼量。

要使用Linq-to-SQL實現這種持久性不可知的方法,您必須在DTO中使用其生成的類,並在DTO和您的實體之間維護映射邏輯。

采用這種方法(如NHibernate)有更好的ORM,可以大大減少對DTO的需求。

似乎對DB列的默認值沒有任何支持。

這個問題被問過一次在這里 但是,從本質上講,LINQ to SQL會在您的數據庫中生成次優執行計划。 對於您搜索的每個不同長度的參數,它將強制創建不同的執行計划。 這最終會阻塞數據庫中用於緩存執行計划的內存,並且您將開始使舊查詢過期,這些查詢在再次出現時需要重新編譯。

正如我在與之相關的問題中所提到的,這是你想要完成的事情。 如果您願意以執行速度交換開發速度,LINQ to SQL可能是一個不錯的選擇。 如果您擔心執行速度,可以使用其他可能需要更長時間的ORM / DAL /解決方案,但會為您提供針對架構更改和更好性能解決方案的未來驗證,但需要額外的開發開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM