多数のレコードを持つ関連プロパティへのアクセス速度に問題があります。
という親クラスを持つ XAF アプリがありMyParent
ます。
には 230 件のレコードがありますMyParent
。
MyParent
という子クラスがありMyChild
ます。
には 49,000 件のレコードがありますMyChild
。
MyParent
と の間にMyChild
標準的な方法で定義された関連付けがあります。
でMyChild
:
// MyChild (many) and MyParent (one)
[Association("MyChild-MyParent")]
public MyParent MyParent;
そしてでMyParent
:
[Association("MyChild-MyParent", typeof(MyChild))]
public XPCollection<MyCHild> MyCHildren
{
get { return GetCollection<MyCHild>("MyCHildren"); }
}
と呼ばれる特定のMyParent
レコードがありMyParent1
ます。
の場合MyParent1
、630MyChild
件のレコードがあります。
というクラスの DetailView がありMyUI
ます。
ユーザーがMyUI
DetailView の 1 つのドロップダウンでアイテムを選択すると、私のコードは別のドロップダウンにMyChild
オブジェクトを入力する必要があります。
ユーザーはMyParent1
最初のドロップダウンで選択します。
最初のドロップダウンで選択した値MyUI
のオブジェクトのコレクションを返すプロパティを作成しました。MyChild
プロパティのコードは次のとおりです。
[NonPersistent]
public XPCollection<MyChild> DisplayedValues
{
get
{
Session theSession;
MyParent theParentValue;
XPCollection<MyCHild> theChildren;
theParentValue = this.DropDownOne;
// get the parent value
if theValue == null)
{
// if none
return null;
// return null
}
theChildren = theParentValue.MyChildren;
// get the child values for the parent
return theChildren;
// return it
}
DetailView の UI にのみ必要なため、DisplayedValues
プロパティを としてマークしました。NonPersistent
永続化することでコレクションの作成が初めて速くなるとは思いません。また、ドロップダウンを埋めるために使用された後は必要ないので、保存に時間を費やしたくありません。
問題は、呼び出しに 45 秒かかることtheParentValue = this.DropDownOne
です。
仕様:
- ビスタ事業
- 8 GB の RAM
- 2.33 GHz E6550 プロセッサ
- SQL Server Express 2005
これは、ユーザーが DetailView の多くのドロップダウンの 1 つを待つには長すぎます。
2 つの質問があるため、時間をかけてビジネス ケースをスケッチしました。
関連する値の読み込みを速くするにはどうすればよいですか?
はるかに高速に実行されるドロップダウンと DetailView をプログラムする別の (簡単な) 方法はありますか?
はい、ドロップダウンに表示するには 630 は項目が多すぎると言えますが、このコードは非常に時間がかかります。速度は 630 ではなく 49,000 に比例すると思われます。ドロップダウンの 100 項目は私のアプリには多すぎません。
アプリにはこれらのドロップダウンがかなりの数必要なので、ユーザーに各ドロップダウンに対してより複雑なフィルター条件を入力するように強制するのは適切ではありません。ユーザーは 1 つの値を選択して、関連する値を表示する必要があります。
多数のレコードを見つけるのが遅いかどうかは理解できますが、数百のレコードを見つけるのにそれほど時間がかからないはずです。