2017-07-06 15 views
0

如果您能想出一種改進方法,請編輯標題。有效的方法來統計數據庫中具有某些特徵的對象的數量


我有一張表,其中包含數十行現在,但將有數以百計的生產和最終可能數以千計。我需要計算有多少具有某些特徵,例如將enum屬性設置爲目標枚舉。

對於這個問題的緣故,我們會說我是在我的模型:

public enum Types { One, Two, Three, Four } 
public Types Type = Types.One; // Or Two, etc. 

目前,每次索引頁 - 其中列出了這些條目 - 被訪問時,我列舉(? )One, Two, Three, Four的計數器並將其顯示在頁面的頂部。

電流法:
- 遍歷表中的每一個對象,檢查其屬性,並增加相關的計數器(S) - 每個列表加載

潛在方法時間:
- 是任何LINQ更快?即db.MySet.Where(obj => obj.Type == Model.Types.One)
- 我可以隨時將這些計數器保存在內存中嗎?不知道該怎麼做。如果可能的話,將在MyModelController.Create方法中增加一個潛在的解決方案。

+0

我會試圖使用一種完全不同的方法。我會在數據庫表上使用觸發器來更新單獨的「計數器」表中的值。然後,我需要做的就是從計數器表中讀取列標題,小心刷新主表的任何更改。觸發器只會做CountA = CountA + 1或CountB = CountB-1,這比每次重新計算整個表要快得多。 –

+0

@JonathanWillcock在這裏,我想知道如何使用持久數據,當我有一個數據庫坐在我面前...我不知道如何捕捉數據庫的變化比'Controller.Create'更優雅,但我想這會做到這一點。任何潛在的同步問題?不確定爲什麼會有,特別是,但這樣做會讓我擔心潛在的丟失增量週期和永久不正確的計數器。 – Sinjai

+0

如果你的觸發器是正確的(而且它們確實不難)並且初始值是正確的,那麼它們將保持完全一致。如果你感覺特別偏執,你可以經常進行定期檢查以保持心情平衡 - 對每一次改變計算所有數字仍然是可取的。 –

回答

1

潛在方法: - LINQ是否更快?即db.MySet.Where(obj => obj.Type == Model.Types.One)

LINQ會更好,更快。實際上,所有的工作都會執行SQL Server - 而不是你的應用程序,SQL Server針對這些任務進行了優化。和用於計數目標更好的LINQ代碼爲db.MySet.Count(obj => obj.Type == Model.Types.One)

  • 我可以保持這些計數器在內存中在所有時間?不知道該怎麼做。如果可能的話,一個潛在的解決方案將被添加到MyModelController.Create方法中的這些計數器的 。

我不知道你的意思,但你,因爲控制器爲每個請求創建,並請求處理後銷燬不能保持東西控制器變量。您可以將這些數據保存在單獨的商店中,但我認爲這是不必要的併發症。

+0

您如何看待Jonathan在問題評論中的建議?我傾向於贊同他的建議:商店櫃檯放在自己的桌子上,根據需要增加。 +1(對於'Count()' – Sinjai

+0

我認爲你可以從EF和LINQ開始,因爲你已經熟悉這個框架,並且因爲數千行是數據庫的小表大小,如果你看到性能問題,你可以改變觸發器的方法。 –

+0

即使我要避免使用SQL Server觸發器,我仍然不能更好地使用計數器方法嗎?添加一個具有'int'屬性的EF實體,並在'ModelBinder'中增加它的值? – Sinjai

相關問題