5

我正在寻找在 C# 中构建一些数据聚合的东西,我想要类似于实时数据透视表的东西,或者某种持续更新的 SQL 查询,支持select, sum, average, first, where, 和group-by(where firstis in “给我第一个值”的 LINQ 意义)。

例如,我可能有一个Trans用列NameDate和调用的表对象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 聚合在整个表中枚举)。

有谁知道我可以查看的类似这样的项目,或者对如何自己设计/构建它有建议?

编辑:我应该注意,数据实际上不会在数据库中,而是在内存中。

4

3 回答 3

3

第一个替代解决方案是使用基础数据更改进行聚合 - 即,当我更新总计记录时,也去更新总计。要这样做,您将需要旧值,但是它也会增加您对聚合值所做的任何更改的开销。但是,如果要汇总现有数据的全部目的,它可能是一个可行的选择。

我使用我的银行余额应用程序执行此操作,每当我插入/修改/删除交易时,逻辑也会更新帐户余额,因为余额会被多次搜索,并且当有很多交易时计算起来很快就会变得昂贵。

如果总和存储在数据库中,我认为在结构上你也可能会遇到问题 - 例如锁定问题。我总是将这些值保存在内存中。

更新:另一种可能的解决方案是通过维护层传递您的数据访问代码,该维护层将聚合值保存在内存中 - 这将是快速插入/更新/删除基础数据时几乎为 0 的开销。您还可以变得聪明并让这一层可交易,因此如果数据访问操作失败,您可以回滚聚合更改。

唯一的缺点是数据库更改必须通过该层以避免使聚合失效,并且需要在首次运行或重新启动时从数据库进行初始化。

于 2010-07-14T16:01:42.973 回答
1

你看过Push LinqReactive Extensions (Rx)吗?

虽然我都没有使用过,但我相信两者都允许您在流数据上使用 LINQ 运算符。

有关 Rx 的更多信息可以在 DevLabs 网站上找到:

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

于 2010-07-14T16:02:30.430 回答
0

有一个更积极开发的项目叫做 OLinq 你也可以试试

http://nuget.org/packages/OLinq

于 2013-04-17T16:30:51.520 回答