5

私は C# でいくつかのデータ集計機能を構築しようとしています。リアルタイムのピボット テーブルに似たもの、またはselectsumaveragefirstwhereおよびgroup-by( where firstis in 「最初の値を与える」という LINQ の意味)。

たとえば、TransNameDate、およびで呼び出されるある種のテーブル オブジェクトと、列およびTotalで呼び出される別のテーブルがあるとPriceします。(擬似SQLで)実行するある種のインスタンスを作成したいNamePriceQuery

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

最初の代替ソリューションは、基になるデータの変更を使用して集計することです。つまり、合計レコードを更新するときに、合計も更新します。このようにするには、古い値が必要ですが、集計値に加えた変更にオーバーヘッドが追加されます。しかし、存在するデータの全体的な目的が集約されることである場合、それは実行可能なオプションになる可能性があります.

これは、銀行の残高調整アプリで行います。トランザクションを挿入/変更/削除するたびに、ロジックによって口座残高も更新されます。これは、残高が何度も検索され、多くのトランザクションがあるとすぐに計算コストが高くなる可能性があるためです。

構造的にも、合計がデータベースに保存されていると、ロックの問題などの問題が発生する可能性があると思います。私は常にこれらの値をメモリに保持します。

更新:別の可能な解決策は、メモリに集計値を保持するメンテナンス レイヤーを介してデータ アクセス コードを渡すことです。また、巧妙になってこのレイヤーをトランザクション可能にすることもできます。これにより、データ アクセス アクションが失敗した場合に、集計の変更をロールバックできます。

唯一の欠点は、集計が無効にならないようにデータベースの変更がレイヤーを通過する必要があり、最初の実行時または再起動時にデータベースから初期化する必要があることです。

于 2010-07-14T16:01:42.973 に答える
1

Push LinqまたはReactive 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 に答える