我有一个 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 可以与存储过程交互吗?
提前致谢