3

多数のレコードを持つ関連プロパティへのアクセス速度に問題があります。

という親クラスを持つ 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ます。

ユーザーがMyUIDetailView の 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 つの質問があるため、時間をかけてビジネス ケースをスケッチしました。

  1. 関連する値の読み込みを速くするにはどうすればよいですか?

  2. はるかに高速に実行されるドロップダウンと DetailView をプログラムする別の (簡単な) 方法はありますか?

はい、ドロップダウンに表示するには 630 は項目が多すぎると言えますが、このコードは非常に時間がかかります。速度は 630 ではなく 49,000 に比例すると思われます。ドロップダウンの 100 項目は私のアプリには多すぎません。

アプリにはこれらのドロップダウンがかなりの数必要なので、ユーザーに各ドロップダウンに対してより複雑なフィルター条件を入力するように強制するのは適切ではありません。ユーザーは 1 つの値を選択して、関連する値を表示する必要があります。

多数のレコードを見つけるのが遅いかどうかは理解できますが、数百のレコードを見つけるのにそれほど時間がかからないはずです。

4

4 に答える 4

2

まず、この操作にこれほど時間がかかることに懐疑的であることは間違いありません。XPO on read 操作は 30 ~ 70% のオーバーヘッドしか追加しないはずです。

いくつかの一般的なパフォーマンスのヒントは DevExpress フォーラムで入手でき、オブジェクト キャッシング、遅延ロードとディープ ロードなどを中心にしていますが、あなたの場合、問題は別のものだと思います。残念ながら、あなたの質問から何が起こっているのかを推測するのは非常に困難です。つまり、XPO の問題である可能性は非常に低く、別の問題である可能性がはるかに高くなります。セッションの作成 (これによりオブジェクト キャッシュも作成されます) と SQL 接続コード (IDataStore のもの) を確認したいと思います。接続は次のとおりです。ホストをきれいに解決できない場合は遅くなることが多く、接続をプール/再利用していない場合、この問題は悪化する可能性があります。

于 2008-09-16T22:50:20.837 に答える
1

なぜあなたがあなたのやり方でそれをしているのかわからない. このような関連付けを作成した場合:

public class A : XPObject
{
    [Association("a<b", typeof(b))]
    public XPCollection<b> bs { get { GetCollection("bs"); } }
}

public class B : XPObject
{
    [Association("a<b") Persistent("Aid")]
    public A a { get; set; }
}

次に、ドロップダウンにデータを入力する場合 (lookupEdit コントロールなど)

A myA = GetSomeParticularA();
lupAsBs.Properties.DataSource = myA.Bs;
lupAsBs.Properties.DisplayMember = "WhateverPropertyName";

A の子をロードする必要はありません。XPO は必要に応じてそれらをロードします。これにはセッション管理はまったく必要ありません。

于 2009-07-23T04:43:57.877 に答える
0

あなたのケースについてはよくわかりません。XAFでの私の経験を共有したいと思います。

ドロップダウン(ルックアップリスト)コントロール(詳細ビュー)を初めてクリックすると、リストに入力するために2つのクエリがデータベースに送信されます。私のテストでは、IDプロパティとNameプロパティだけでなく、オブジェクト全体がソースコレクションに読み込まれることがあります。オブジェクトによっては、リストに軽いオブジェクトを使用することもできます。リストのサーバーモードをオンにすると、毎回128個のオブジェクトのみがロードされます。

于 2010-08-13T07:13:21.300 に答える
0

答えてくれてありがとう。あなたが示唆するように、私は別のソリューションを作成し、良いパフォーマンスを得ることができました。

私の SQL 接続は問題なく、アプリの他の機能と連携しています。

私は XAF を使用していて、余計なことや凝ったことをしていないので、私のセッションは XAF によって管理されているのでしょうか?

私が使用するセッションは、DetailView から読み取られます。

于 2008-09-18T10:52:21.060 に答える