1

我有一个 Web 应用程序(c# 中的 ASP.NET 4.0),我正在构建一个伪 Adhoc 组件。该组件允许用户从预先确定的类别列表中进行选择(汽车品牌、保养型号、汽车配件等)。用户可以根据需要选择任意数量的类别,然后按下“过滤器”按钮,该按钮将获取所选类别并将它们发送到带有每个类别选项的新表单。每个类别可以有多个选项。

示例:用户选择汽车颜色、汽车配件。

过滤器页面显示了一个带有预先填充了汽车颜色颜色的下拉列表的表单。表单显示一个用于卫星广播的复选框,另一个用于皮革内饰的复选框,等等。所有这些值都是预定义的。一旦用户指定了他们可以过滤的所有项目,我就使用 Linq 来查询数据库。就像现在一样,Linq 查询针对的是当前拥有 14 个左外连接的视图,如果根本没有过滤,则返回超过 30,000 行。

我正在使用动态 linq 来查询数据库链接,所以:

var data = CMS.Model.Adhoc.GetData().AsQueryable(); //must be AsQueryablefor Dynamic Linq to function

    public static List<ViewADHOCContractInfo> GetData()
    {
        PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString);

        return db.ViewADHOCInfos.Select(x=>x).Distinct().ToList();
    }

请注意,GetData() 正在返回结果集的所有行和所有列,我认为这不是最有效的方法,更多的是在底部。

从那里我对发送的过滤器执行 FOREACH 语句,并在每次迭代中最小化结果集,如下所示(缩写):

foreach (Filters filter in filters.OrderBy(x=>x.strOrderNumber))
        {
            SanatizeFilter(filter.strFilter,filter);
            if (filter.strValue != string.Empty && filter.strValue != null)
            {
                if (filter.strOperator == "Contains")
                {
                    data = data.Where(filter.strFilter + "!= NULL and " + filter.strFilter + ".Contains(@0)", filter.strValue).
                        Select(x => x).ToList().AsQueryable();
                }
                else
                {
                    data = data.Where(filter.strFilter + FormatOperator(filter.strOperator) + "@0", filter.strValue).
                        Select(x => x).ToList().AsQueryable();


                }
            }
        }

所有这些都可以正常工作,但是速度很慢。我的第一个问题是,我怎样才能使用 Linq 来减少它。我已经尝试了一些方法来仅将来自过滤器的数据拉入变量“数据”作为预填充的一种方式,但是我无法使用 .AsQueryable()。我希望能够从过滤器对象中获取列标识符并仅从数据库中选择那些标识符,这样我就不必处理所有的开销,但我找不到允许我的解决方案这样做,有什么想法吗?

第二个问题是现在这一切都在数据库中的一个视图中,将它移动到函数或存储过程会更快/更有效吗?Linq 可以与存储过程交互吗?

提前致谢

4

1 回答 1

1

好吧,您的问题可以分为两部分:

1) 我的 linq-2-sql 方法好吗

2)我的数据库方法好吗

第一部分可以通过分析发送到数据库的 SQL 来解决。这将向您显示实际执行的查询/查询。正如您在评论中看到的那样,通过在您的方法早期使用 ToList() ,这可能远非最佳。数据库在过滤和处理大量数据方面非常出色。所以让他们做他们最擅长的事情吧!

现在你问题的第二部分是关于观点的。使用存储过程等会更快吗?要回答您的部分问题:是的,Linq-2-sql 也可以使用存储过程。但是,如果您使用存储到过程来检索太多数据,它仍然会很慢。这是故事的 DBA 部分。也许基表上的一些索引就足够了。另一种方法是向视图添加聚集索引,然后将其具体化。

我建议您首先处理 linq-2-sql 部分:确保实际执行的 sql 是基于集合的,并且所有过滤都在数据库中完成。如果仍然太慢,请转到数据库层,看看那里可以改进什么。

于 2012-06-20T16:41:56.837 回答