2017-07-06 35 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

相关问题