ASPxComboBox使用XpoDataSource过滤大型数据集(DevExpress)

时间:2013-07-22 13:34:50

标签: asp.net devexpress xpo

我尝试过滤使用XpoDataSource获取数据的ASPxComboBox,请注意,从小数据集恢复和过滤数据工作正常,当我尝试从数据源过滤大型数据集 - 大约70000条记录时,问题就开始了ComboBox加载由于XpoDataSource从数据库表中获取所有数据,因此变得非常慢。 所以我为XpoDataSource创建了一个标准,以减少恢复的记录数,然后ComboBox在向下滚动ComboBox时重复前十条记录,我不知道问题出在哪里。

我意识到我需要的东西类似于以下link

中的示例

但是使用XpoDataSource而不是SqlDataSource1。 我不知道如何为XpoDataSource编写类似的代码。

这是我的代码:

protected void cmbServices_OnItemRequestedByValue_SQL(object source, DevExpress.Web.ASPxEditors.ListEditItemRequestedByValueEventArgs e)
    {
        try
        {
            string criteria = "";
            if (string.IsNullOrEmpty(e.Value.ToString()) || e.Value.ToString().Length < 3)
            {
                criteria = "1 = 2";
            }
            else
            {

                criteria =
                    string.Format("(( Code like '{0}%' OR ProductName like '{0}%') AND  CustomerId = {1})", e.Value.ToString(), (cmbServicesActivities != null && cmbServicesActivities.Value != null) ? cmbServicesActivities.Value.ToString() : "0");
            }
            dsServices.Session = LookupsSession;
            dsServices.Criteria = criteria;
            cmbServicesDescription.DataSource = dsServices;
            cmbServicesDescription.DataBind();
        }
        catch (Exception exc)
        {
            Debug.WriteLine(exc.Message);
        }
    }

1 个答案:

答案 0 :(得分:0)

以下Example演示了我的问题的答案

public partial class _Default : System.Web.UI.Page {
Session session = XpoHelper.GetNewSession();

protected void cmb_ItemRequestedByValue(object source, DevExpress.Web.ASPxEditors.ListEditItemRequestedByValueEventArgs e) {
    MyObject obj = session.GetObjectByKey<MyObject>(e.Value);

    if (obj != null) {
        cmb.DataSource = new MyObject[] { obj };
        cmb.DataBindItems();
    }
}

protected void cmb_ItemsRequestedByFilterCondition(object source, DevExpress.Web.ASPxEditors.ListEditItemsRequestedByFilterConditionEventArgs e) {
    XPCollection<MyObject> collection = new XPCollection<MyObject>(session);
    collection.SkipReturnedObjects = e.BeginIndex;
    collection.TopReturnedObjects = e.EndIndex - e.BeginIndex + 1;
    collection.Criteria = new BinaryOperator("Title", String.Format("%{0}%", e.Filter), BinaryOperatorType.Like);
    collection.Sorting.Add(new SortProperty("Oid", DevExpress.Xpo.DB.SortingDirection.Ascending));

    cmb.DataSource = collection;
    cmb.DataBindItems();
}