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条记录。

我有一个名为MyUI.

用户在 DetailView 的一个下拉列表中选择一个项目MyUI,而我的代码必须用对象填充另一个下拉列表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
    }

DisplayedValues我将该属性标记为,NonPersistent因为它只需要 DetailVIew 的 UI。我不认为第一次持久化它会加快集合的创建,在它用于填充下拉列表之后,我不需要它,所以我不想花时间存储它。

问题是调用需要 45 秒theParentValue = this.DropDownOne

眼镜:

  • 远景商务
  • 8 GB 内存
  • 2.33 GHz E6550 处理器
  • SQL Server 速成版 2005

这对于用户来说等待 DetailView 中的许多下拉菜单之一太长了。

我花时间草拟商业案例,因为我有两个问题:

  1. 如何使关联的值加载更快?

  2. 是否有另一种(简单)方法可以对运行速度更快的下拉菜单和 DetailView 进行编程?

是的,您可以说 630 项太多,无法在下拉列表中显示,但是这段代码需要很长时间,我怀疑速度与 49,000 成正比,而不是与 630 成正比。下拉列表中的 100 项将我的应用程序不会太多。

我的应用程序中需要很多这样的下拉菜单,因此不适合强制用户为每个下拉菜单输入更复杂的过滤条件。用户需要选择一个值并查看相关值。

如果查找大量记录很慢,我会理解,但查找几百条记录不应该花那么长时间。

4

4 回答 4

2

首先,您对这个操作应该花费这么长时间持怀疑态度是正确的,读取操作上的 XPO 应该只增加 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

感谢你的回答。正如您所建议的,我创建了一个单独的解决方案并且能够获得良好的性能。

我的 SQL 连接正常,可与应用程序中的其他功能配合使用。

鉴于我正在使用 XAF 而没有做任何额外/花哨的事情,我的会话不是由 XAF 管理的吗?

我使用的会话是从 DetailView 中读取的。

于 2008-09-18T10:52:21.060 回答
0

我不确定你的情况,只是想分享一些我对 XAF 的经验。

第一次单击下拉(查找列表)控件(在详细视图中)时,将有两个查询发送到数据库以填充列表。在我的测试中,有时整个对象都被加载到源集合中,而不仅仅是我们认为的 ID 和 Name 属性,这取决于您的对象,您可能希望将较轻的对象用于列表。您也可以打开列表的服务器模式,然后每次只加载 128 个对象。

于 2010-08-13T07:13:21.300 回答