私の状況は次のとおりです。統計を含む 2 つのテーブル、統計定義用のテーブル、および統計イベント用のテーブルがあります。統計イベント テーブルの各行には、タイムスタンプ、値、およびそれが適用される統計定義への参照があり、各統計定義には統計エントリのコレクションがあります。(つまり、1 対多)
私のアプリでは、ユーザーは統計の定義と日付範囲を選択でき、選択した定義の統計イベント テーブルからエントリをグラフ化できます。ただし、ユーザーが大きな日付範囲を選択する可能性があり、必要以上の数のイベントが返される可能性があります。
ユーザーが選択した時間範囲に均等に分散されたデータのサブセット (n ポイント) を返したいと思います。私の現在の(素朴な)実装は次のとおりです。
var totalEntries = session.QueryOver<StatEvent>()
.Where(x => x.Date > start_date && x.Date < end_date && StatDef.Id == defn.Id)
.List()
int modFactor = (int) Math.Ceiling((double)totalEntries.Count/30);
var temp = totalEntries.Where((x, i) => i%modFactor == 0);
return temp.OrderBy(x => x.Date).ToList();
そのため、日付範囲と統計定義に一致する DB からすべてのレコードを取得し、30 のエントリを選択しています。
このアプローチの問題点は次のとおりです。
1) DB からすべてのエントリを取得してから、不要なものを破棄するのは効率的ではありません。
2) データがまとまっている場合 (つまり、特定の時間帯には多くのレコードがあり、別の時間帯にはあまりレコードがない場合)、選択はデータが最も多い場所に重み付けされます。これは必ずしも悪いことではありませんが、グラフがよりきれいになり、データ ポイントが均等に分散されるようにしたいと考えています。
それで、同じ結果をより効率的な方法で達成するスマートな方法を知っている人はいますか?
ありがとう!