C# 计算数据库中具有特定特征的对象数量的有效方法

C# 计算数据库中具有特定特征的对象数量的有效方法,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,如果你能想出改进的办法,请编辑标题 我现在有一个包含几十行的表,但生产中将有数百行,最终可能有数千行。我需要计算有多少具有某些特征,例如将枚举属性设置为目标枚举 为了回答这个问题,我们会说我的模型中有: public enum Types { One, Two, Three, Four } public Types Type = Types.One; // Or Two, etc. 目前,每次访问列出这些条目的索引页时,我都会枚举1、2、3、4的(?)计数器,并将它们显示在页面顶部 当前方法

如果你能想出改进的办法,请编辑标题


我现在有一个包含几十行的表,但生产中将有数百行,最终可能有数千行。我需要计算有多少具有某些特征,例如将枚举属性设置为目标枚举

为了回答这个问题,我们会说我的模型中有:

public enum Types { One, Two, Three, Four }
public Types Type = Types.One; // Or Two, etc.
目前,每次访问列出这些条目的索引页时,我都会枚举
1、2、3、4
的(?)计数器,并将它们显示在页面顶部

当前方法:
-循环表中的每个对象,检查其属性,并在每次加载列表时递增相关计数器

可能的方法:
-林克快了吗?i、 e.db.MySet.Where(obj=>obj.Type==Model.Types.One)
-我可以一直将这些计数器保存在内存中吗?我不知道该怎么做。如果可能的话,一个可能的解决方案是在
MyModelController.Create
方法中添加这些计数器

可能的方法: -林克快了吗?i、 e.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方法中

我不知道你的意思,但是你不能在控制器变量中保留一些内容,因为控制器是为每个请求创建的,并且在请求处理后销毁。您可以将这些数据保存在单独的存储中,但我认为这是不必要的复杂性。

我可能会尝试使用完全不同的方法。我将使用数据库表上的触发器更新单独“计数器”表中的值。然后,我需要做的就是从计数器表中读取列标题,小心地刷新主表的任何更改。触发器将只执行CountA=CountA+1或CountB=CountB-1,这将比每次重新计算整个表的速度快得多。@JonathanWillcock这里我想知道如何使用持久数据,当我面前有一个数据库时。。。我不知道如何比Controller.Create更优雅地捕获数据库更改,但我想这样就可以了。这里有任何潜在的同步问题吗?特别是,我不确定为什么会出现这种情况,但这样做会让我担心可能会错过一个增量周期,并且计数器永远不正确。如果您的触发器是正确的(而且并不困难),并且初始值是正确的,那么它们将保持完全一致。如果你感觉特别偏执,你可以随时进行定期检查,以确保心情平静——这仍然比计算每次更改的次数更好。使用触发器的全部目的是让数据库为你捕获更改@JonathanWillcock我边走边教自己。。。我不知道这些触发因素是什么……你对乔纳森在问题评论中的建议有何看法?我倾向于同意他的建议:将计数器存储在自己的表中,根据需要递增+1对于
Count()
我认为您可以从EF和LINQ开始,因为您已经熟悉这个框架,而且数千行对于数据库来说是一个小表大小,如果您看到性能问题,您可以将方法更改为触发器。如果仍然使用计数器方法,不是更好吗,即使我要避免SQL Server触发器?添加一个具有
int
属性的EF实体,并在
ModelBinder
中增加其值?不,LINQ方法会更快,在
ModelBinder
中增加值将导致并发问题。好的,但假设我使用Jonathan的触发器建议。我发现很难相信使用数据库触发器和每次都计算它们之间的性能差异是可以忽略不计的。