产品过滤器,复选框循环 - 加快过程

时间:2012-09-19 20:24:20

标签: c# asp.net filter webforms

我正在使用ASP.NET Webforms。我正在创建基于其属性过滤产品的功能。

我现在这样做的方式花了太长时间。我需要一种更好,更快的方式。

我目前的方法如下。我有一个GridView,它显示属性名称。 CheckBoxList嵌套在包含属性值的ItemTemplate中。 CheckBoxList具有autopostback =“true”。在每个selectedindexchanged事件中,我遍历复选框并根据选中的状态进行过滤。然后,我比较过滤结果和复选框值,并禁用不在过滤结果中的复选框。

这是执行该操作的代码:

protected void cblAttr_SelectedIndexChanged(object sender, EventArgs e)
{
    var filteredResults = ProductAttribute.Get(Convert.ToInt32(Request.QueryString["idsite"]));
    var selectedAttributes = filteredResults;

    foreach (GridViewRow row in gridAttrSet.Rows)
    {
        foreach (ListItem item in ((CheckBoxList)row.FindControl("cblAttr")).Items)
        {
            if (item.Selected == true)
            {
                // filter
                selectedAttributes = selectedAttributes.Where(a => a.idAttr == Convert.ToInt32(item.Value)).ToList();
            }
        }
    }

    // this will now contain 
    filteredResults = (from c in filteredResults
                       join o in selectedAttributes
           on c.idProduct equals o.idProduct
                select new ProductAttribute
                {
                    idProduct = c.idProduct,
                    idAttrSet = c.idAttrSet,
                    idAttr = c.idAttr,
                }).ToList();


    foreach (GridViewRow row in gridAttrSet.Rows)
    {
        if (row.RowIndex > ((GridViewRow)((CheckBoxList)sender).NamingContainer).RowIndex)
        {
            foreach (ListItem item in ((CheckBoxList)row.FindControl("cblAttr")).Items)
            {
                // disable if filtered out
                item.Enabled = !(filteredResults.Where(a => a.idAttr == Convert.ToInt32(item.Value)).ToList().Count == 0);
            }
        }
    } 
}

正如你所看到的,有很多循环,并且可以有数千条记录。

更快的方法是什么?任何想法都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

这里花时间的部分是对数据库的调用。