2011-05-31 120 views
4

我正在將舊的應用程序從WebForms移植到MVC,並且該過程的一部分正在拆除現有數據層,將邏輯從存儲過程移至代碼。正如我最初只使用基本的C#SQL函數(System.Data.SqlClient)一樣,我使用了輕量級的僞ORM(PetaPoco),它只是將SQL語句作爲字符串執行並執行。構建動態查詢在SQL中的工作原理與許多條件相同,即添加和刪除附加代碼(平均查詢約有30個過濾器)。動態查詢的最佳選擇?

所以環顧了一下後,我發現了一些選擇:

  • 一串字符串和在需要時添加查詢的條件語句位的。真的很討厭,特別是當查詢變得複雜時,而不是我想追求更好的解決方案。
  • A bunch of conditionals using L2E。看起來更優雅,但我測試過的L2E太臃腫,一般來說是一次糟糕的經歷。我可以在L2S中做同樣的事嗎?如果是這樣,L2S是否會在未來5 - 10年內堅持下去?
  • 使用PredicateBuilder。仍在研究這個,關於L2S的相同問題。編輯:我也可以堅持現有的存儲過程模型,但我不得不重寫它們,所以它不會傷害到其他選項,因爲我仍然要做腿部工作。

有沒有其他的選擇嗎?任何人都可以在任何提及的方法上體驗一些經驗 - 主要是,您選擇的方法是否讓您想要構建一個時間機器並殺死您,以便實施它?

+0

只是我的兩分錢,當EF4出來時我真的很興奮。現在用它在過去的一年後,我一直在與膨脹時,在某些建模方案的複雜性,以及所產生的SQL真不爽。我永遠不會再使用EF--一直以來都是使用一個精簡API的存儲過程。不回答你的問題 - 但認爲ID增加了我的兩分錢。 – RPM1984 2011-06-01 00:15:47

+0

由於淨3.5的,流行的觀點認爲L2S產生更有效的SQL比L2E。我不知道L2E的更新(包括和更高版本.net 4.0)是否已經發生了變化。在L2S中測試相同的條件應該相當簡單。 **你有沒有考慮過只保留當前的存儲過程?** – jlnorsworthy 2011-06-01 00:17:09

+0

@jlnorsworthy - 這當然是一種選擇,我應該在上面添加它(我將編輯它)。重要的一點是,無論我選擇什麼方案,都需要重寫(它們非常複雜,而且速度很慢),所以現在是貨比三家瞭解替代品的好時機。 – tennesseepusher 2011-06-01 00:25:07

回答

3

我會看看LLBLGen。它生成的代碼非常好,可以自定義。他們還提供了一個強大的LINQ提供商,可以幫助您的查詢。我用它做了幾個大型項目,非常開心。

http://www.llblgen.com/

1

不是一個真正的答案,但過長的註釋:

我已經建立了使用「串聯SQL塊」方法的中型Web應用程序,並在這個過程中我目前做類似的工作,但使用L2E。

我發現,有了一些自我控制,concatenate-pices-of-sql方法並沒有那麼糟糕。當然,使用參數化查詢,不要試圖直接將用戶輸入粘貼到SQL中。

雖然我一直在慢慢增長對L2E方法的理解。它提供了類型安全性,但是你必須做一些「倒退」的事情,從你如何使用SQL來做 - 例如WHERE X IN (...)構造。但到目前爲止,我還沒有碰到任何L2E無法處理的事情。

我覺得如果其他人大量參與L2E方法會更容易維護。

您是否有實際使用情況,其中L2E的「膨脹」是一個問題?或者這只是一種普遍的不適感,你覺得框架在幕後做得太多了?我確實有這種感覺(確定,還是這樣),當然不喜歡讀取生成的SQL(特別是與我之前項目中的手寫SQL相比),但到目前爲止,我們發現L2E很不錯關於只在實際需要時觸及數據庫。

另一個問題是,你正在使用,以及如何跟上時代的其L2E綁定是什麼DB。如果你使用SQL Server,那麼沒問題。 MySql雖然可能更片面。 L2E的滑溜感的一大塊來自於它與VStudio很好的集成,並VStudio的從你的數據庫建立實體模型自動的能力。不知道對於非MS DB後端的支持有多好。

1

在我看來,無論是L2S也可以L2E高效生成SQL代碼,尤其是當它涉及到複雜的查詢。即使在一些相對簡單的情況下,通過這兩種方法中的任何一種來生成查詢都會導致效率低下的SQL代碼,這裏舉一個例子:Why does this additional join increase # of queries?

這就是說,如果你使用SQL Server L2S是一個更好的選擇,處理任何數據庫;因爲L2E會生成低效的SQL代碼。另外需要注意的一點是L2S或L2E都不會利用tempDB,即生成臨時表或表變量或CTE。

我會重新編寫存儲過程,儘可能優化它們,並使用L2S/L2E進行簡單查詢,這將對服務器產生一次往返(應儘可能低),並且還要確保SQL Server使用的執行計劃是最有效的(即使用索引等)。

Hasanain