2009-08-07 51 views
1

我有一系列的對象,我創建:.NET對象設計

項目

訂購

每個對象都有屬性的合理數量,並且我使用了一個datareader來傳遞它「SELECT * FROM .objectname」。然後我填充一個對象集合,並返回集合。這工作如下:GetOrdersCollection(),GetSongsCollection()等

我明白SELECT *是一個性能問題,此外,有時我更喜歡在選擇語句中包含額外的列中不存在的對象,並讓所有人都返回。

所以我的問題是,解決這個問題的最好方法是什麼?

  1. 我應該爲每個查詢類型創建一個新對象嗎?

  2. 我試着在存儲它之前檢查列是否在datareader中,但是這會顯示perf。的問題。有沒有一個可以忽略的表演。避免IndexOutOfRange的方法?

  3. 我應該只使用Datatable並從表中讀取權限嗎?

回答

2

我明白SELECT *是一個 性能問題,

如果有隻有幾列這不是一個性能問題,或者你需要的所有列的反正。

1.我應該爲每個查詢類型創建一個新的對象嗎?

您應該爲每個表創建一個新對象,併爲每個查詢類型創建一個新方法。

2。我試着在存儲 之前檢查一下列是否在數據讀取器中,但是這提供了性能。的問題。是 有一個可以忽略不計的表演。避免 IndexOutOfRange?

如果您是通過名稱而不是索引引用您的字段,則不應該有任何IndexOutOfRange問​​題。如果您通過索引引用您的字段,則可以將它們循環到索引小於Count()列的位置,並且不應該有任何IndexOutOfRange問​​題。

3.我應該使用Datatable並從表中讀取數據嗎?

這是一個非常好的方法開始。考慮花一些時間來學習其他人建議的簡單ORM。亞音速是一個很好的「第一」ORM。

1

從像DataReader這樣只有前向的數據結構中進行性能讀取會爲您提供最佳的性能和資源節約。

另一方面,填充對象(如OR/M所做的)可以忽略不計,只要您返回的對象數不過多。

您的第一步應該是配置您的數據庫並確保您有適當的索引。寫一些測試,看看你最大的時間花費在哪裏,並優化你最需要的目標區域。

+0

從數據庫返回的數據速度對我來說不是問題。我可以在不到一秒的時間內返回20,000條記錄。我的關注來自於嘗試加載只包含某些查詢所需的連接數據的對象。如果我包含來自另一個相關列的某列,這會打破對象設計。我知道這是一個耦合問題,但我不知道比使用數據表更好的方法。 – 2009-08-07 02:49:54

+0

p.s.我投了你的建議......謝謝。 – 2009-08-07 02:50:54

+0

這就是爲什麼OR/Ms被髮明的原因 - 正如你所發現的,對象不一定映射1到1到數據庫表(我們認爲你最好的選擇是找到一個性能和可​​維護性的快樂媒介 - 不要擔心如何讓您的應用程序企業能夠讓您的應用程序保持可持續性。那有意義嗎? – 2009-08-07 02:55:03

1

是否有任何理由不能使用簡單的ORM生成器,如SubSonic?這將允許您非常輕鬆地訪問這些類型的集合,並且它們將被強制鍵入。由於查詢將由SubSonic構建,因此您也不必擔心SQL。

+0

我正在處理一個已經生成類文件的項目,我不確定我的聲音會被聽到遷移到像LINQ或SubSonic這樣的OR/M。我們目前使用的東西效果很好,我只是尋找一種優雅的方式來將相關數據或部分數據包含在我的對象集合中。 – 2009-08-07 02:52:28

+0

就像OR/M成爲討論話題一樣。如果你有很多多對多的關係,不要花太多時間投資Linq2Sql作爲OR/M。 L2S不直接支持這些。 – 2009-08-07 02:57:17