使用dapper時在哪裡放sql?

asp.net-mvc-3 c# dapper n-tier

我在工作中使用dapper進行mvc3項目,我喜歡它。但是,在使用dapper時,您應該如何對應用程序進行分層?目前我只是把我所有的sql直接塞進控制器( slap ),但我正在考慮用靜態字符串創建一個類..所以我可以做

var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)

使用dapper時如何存儲sql?

一般承認的答案

我會說把你的SQL放在等效的LINQ查詢,或者用於DataContext.ExecuteQuery的sql 。至於那個......好吧,這取決於你,取決於你想要多少分離。

但是,我個人認為將SQL隱藏在遠離Query<T>調用的單獨類中沒有任何好處 - 您希望在上下文中看到它們,以便您可以輕鬆驗證數據(實際上是參數)。您可能還在原位構建查詢(仍參數化)。但對於常規靜態查詢,我會將TSQL保持為代碼附近的文字,除非我有充分的理由需要抽象,即

var reports = conn.Query<Report>(@"
select x.blah, y.blah
from x (snip)
where x.ParentId = @parentId and y.Region = @region", new {parentId, region});

(另請注意上面的替代擴展方法用法)

IMO,上面的關鍵是你不可能任何其他地方重新使用該查詢 - 邏輯將被放入一個方法,並且該方法從多個地方調用。因此,如果您需要支持不同的數據庫提供程序(使用不同的SQL方言),則可能用於隱藏中央包裝器後面的查詢的唯一原因是。這比人們所知道的要少。


熱門答案

使用資源文件對我們非常有用。我們在文件夾call / Sql中創建.sql文件,並將它們拖到我們的SqlResource對象的'Files'部分。對於較小的sql片段(例如我們可能正在查詢的函數),資源文件的“字符串”部分非常簡潔且容易。

所以,我們的sql看起來像:

var reports = conn.Query<Report>(SqlResource.Blahs_get, new {parentId, region});

這使存儲庫真正乾淨。將所有sql放在資源文件中還有其他好處,您可以遍歷這些條目,並可能使用PARSEONLY查詢數據庫,以確保如果db對象發生更改,您的查詢將會中斷(請注意,這主要是但不是100%可靠)。

因此,總而言之,對於我們來說資源文件保持真正乾淨,但對於Marc Gravell而言,它們不是生產代碼中的可重用性......每個sql語句只應由應用程序中的一個點使用。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因