2015-04-03 86 views
2

我正在實施所有的數據訪問與精巧。 我的第一個想法是使用dapper實現存儲庫模式。 from:http://www.bradoncode.com/blog/2012/12/creating-data-repository-using-dapper.html在Dapper DbContext,DbSet等

然後,我將linq表達式添加到精簡的sqlbuilder中以最小化SQL,就像在示例(動態查詢)中那樣。所以,我能寫類似

sqlbuilder.Where(c=>c.Id == 1) or c.Id = myVar 

,現在我問自己,如果是執行喜歡和DbSet和使用LINQ表達的DbContext一個好主意。

問題不在於實現完整的dbset或dbcontext。但只是看起來像(沒有所有複雜性)。

只需要一個DbContext來初始化連接和多個DbSet至少使用Dapper查詢表和一個基於給定鏈接表達式使用dapper sqlbuilder生成SQL的實現。

在閱讀了一些代碼段並與實體框架比較後,我認爲這是浪費時間,因爲實體框架已經做到了。 但隨着精簡版你有生成的SQL的完整控制,它會始終使用相同的模板。

在開始之前(浪費我的時間)我想知道這是不是一個好主意。

編輯:許多評論說,SqlBuider不是一件好事,那爲什麼它在Dapper項目中可用?

+3

如果您需要實體框架的所有功能,請使用Dapper並使用實體框架。 Code-First讓事情變得非常簡單,您不必擔心自己在開發。 – 2015-04-03 14:15:32

+0

你不能兩面都有。 EF和L2S由於某種原因很慢,Dapper因爲某種原因而速度很快。如果你將Dapper轉換爲EF或L2S,那麼它的速度會很慢,因爲SQL生成器並不完美,除非你是設計這種生成器的專家(根據外觀,你不是)你甚至不會接近L2S和EF所做的任何事情,所以你的發電機可能會產生比EF或L2S更高的WORSE結果。請記住,生成優秀的SQL不僅僅是簡單的翻譯。 – 2015-04-03 17:11:23

+0

謝謝你的回答。這只是一個問題,我不會假裝像英孚設計師/開發人員一樣優秀。即使我的問題很愚蠢,一個好的答案可以幫助像我這樣的非專家。 – Madagaga 2015-04-03 17:47:37

回答

5

就我個人而言,我會說這是超出了精巧圖書館試圖提供的內核的東西。這個想法是有價值的,但是我擔心在你這樣做的時候,你基本上只是重新實現了LINQ-to-SQL。有一個更簡單的方法來做到這一點:你只需使用LINQ到SQL。 Dapper通常非常樂意填充L2S模型 - 這就是本質上是我們(精巧的作者)如何使用它(並繼續使用它)與我們預先存在的L2S代碼庫。它也可能類似於EF等。

但是,如果你真的想把這項工作放在裏面,我相信你可以在精簡版的基礎上編寫一個庫來做到這一點。做現有的事情似乎有很多工作要做。

+0

感謝您的回答,並給予建議。最初的想法是在codeplex上使用類似SQLinq.Dapper的東西,但使用lambda表達式。就像使用dbset一樣。 我會考慮它,並嘗試一些ORM。 再次感謝您的所有答案(不僅僅是最後一個)。 – Madagaga 2015-04-03 15:17:54

+0

我發現一些東西看起來像我的想法。 https://code.google.com/p/dapper-dot-net/issues/detail?id=76。所以最初的問題是錯誤的。良好的術語是用於短小精悍的Linq Provider。 – Madagaga 2015-04-03 19:49:58

+0

http://iqtoolkit.codeplex.com/ – Madagaga 2015-04-21 12:53:40

0

Dapper的一個關鍵特性是性能。

創建Dapper是爲了快速將普通SQL的結果映射到對象。絕對不能讓開發人員避免編寫SQL。 對Dapper使用SQL builder可能不是個好主意。更糟糕的想法是實施變更跟蹤。 只需使用實體框架或其他完整的ORM,如果您需要這些功能。

+0

我瞭解你的觀點。這個想法並不是使用EF的所有特性,而只是將linq添加到sql特性中。我真的不知道如何解釋我的想法。真正的目標是具有Iqueryable方法的靈活性並保持精細的性能。對於我的項目,他們需要一個沒有寫字符串的sql構建器,所以linq表達式對我來說是最好的方式,不是嗎? – Madagaga 2015-04-03 14:40:36

+0

你不能保持Dapper性能:) IQueryable是關於懶惰評估,在這種情況下,它意味着性能下降。你真的需要這麼高的表現嗎?您是否嘗試過更適合的替代方案,如Subsonic ORM? – Dissimilis 2015-04-03 14:54:56

+0

我們不是在談論同樣的事情。我需要的iqueryable或ienumerable的部分只是查詢語法而不是所有其他機制。由於編寫查詢的方式,這是理所當然的。我不需要更改跟蹤對象存儲等。只要能夠吹捧寫類似dbset .where(c => c.foo ==「bar」)的東西生成良好的sql執行與短小精悍和返回ienumerable T.這是我的想法。 – Madagaga 2015-04-03 17:29:47

相關問題