我正在寻找用C#构建一些数据聚合的东西,我想要类似于实时数据透视表或某种持续更新的SQL查询,并支持select
,sum
,average
,first
,where
,和group-by
(其中first
在LINQ意义上是“给我第一个值”)。
例如,我可能有一个名为Trans
的表对象,其列为Name
,Date
和Total
,而另一个表名为Price
的表具有Name
和Price
列。我想创建某种类型的Query
实例(在伪SQL中)
select Name, sum(Total), first(Price) from Trans, Price join on Name group by Name
并将其传递给具有指向数据源链接的
Aggregator
实例。与此同时,我想注册一个在查询产生的行发生更改时命中的回调。因此,如果名为“XYZ”的实体的价格发生变化,则回调将触发一个对象,该对象包含该汇总行的新值。我还希望Aggregator
尽可能高效,因此它将具有某种索引方案,因此无论何时更改值都不需要进行表扫描。我不太确定如何称呼这种事情,并且我希望能够完全用C#实现某些事情,前提是它并不比我想象的要复杂一个数量级。我已经读过Continuous LINQ和Bindable LINQ,但是我真的感觉不到是否适合这个问题,或者是否存在性能问题(例如,只要值改变,LINQ聚合就会在整个表中枚举)。
有谁知道一个项目可以像我这样看待,或者对如何自己设计/ build 有建议?
编辑:我应该注意,数据实际上不会在数据库中,而是会在内存中。
最佳答案
第一种替代解决方案是使用基础数据更改进行汇总-即,当我更新总计记录时,也要更新总计。为此,您需要使用旧值,但是这也会增加对汇总值所做的任何更改的开销。但是,如果要汇总现有数据的全部用途,则可能是一个可行的选择。
我使用银行余额应用程序执行此操作,每当我插入/修改/删除交易时,逻辑也会更新帐户余额,因为对余额进行了多次搜索,如果有很多交易,计算很快就会变得昂贵。
我也从结构上认为,如果将总和存储在数据库中,您可能会遇到问题-例如锁定问题。我总是将这些值保存在内存中。
更新:另一个可能的解决方案是通过维护层传递数据访问代码,该维护层将聚合值保留在内存中-这将使插入/更新/删除基础数据的速度非常快,几乎是零开销。您还可以变得聪明,并使该层可交易,因此,如果数据访问操作失败,则可以回滚聚合更改。
唯一的缺点是数据库更改必须经过该层以避免聚合无效,并且它需要在首次运行或重新启动时从数据库进行初始化。
关于c# - 实时数据聚合的设计建议?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3248063/