ページングされた結果を提供するクエリを構築する必要があります。フィルタリングの一部はデータベースで発生し、その一部はメモリ内のオブジェクトで発生します。データベースとオブジェクトクエリをlinqで混合し、ページングされた結果を提供
以下は、データベースに対してlinqクエリを実行し、さらにカスタムコードを使用してそれをフィルタリングしてから、ページングにskip/takeを使用する方法を示した簡単なサンプルですが、これは非常に非効率的ですクエリの最初の部分と一致するすべての項目を読み込みます。
Things.Where(e=>e.field1==1 && e.field2>1).ToList()
.Where(e=>Helper.MyFilter(e,param1,param2)).Skip(m*pageSize).Take(pageSize);
myFilterを関数は、データベース内に配置されておらず、それは追加のパラメータ(上記の例でparamX)
で実行され、追加のデータを使用して初期をロードせずにこのような状況に対処するための好ましい方法はあります結果は完全にメモリに格納されます。
MyFilter関数がdbにない追加情報を使用するため、最初のオプションは使用できません。 Myfilterの結果を保存するには、Myfilterに実際に追加のパラメータがあるため実行できません。私はそれに応じて質問を更新しました。 – cellik
MyFilterの結果をデータベースに保存する場合、計算方法は関係ありません。データベースを照会しているときではなく、エンティティが変更されたときに保存しています。 –
データベース外の要件がある場合は、結果をデータベースにページする方法がないため、ページングする前に結果をメモリにロードする必要があります。 –