在产品分类列表页面如何做到参数筛选,即如果该分类的参数是查询出来的,参数个数是不固定的,我们需要点击某个参数值去筛选产品,实现效果可以参见京东的分类列表页面。下面就是实现的方法,其中Product是产品表,Product_relate_spec是产品参数关联表,Product_relate_spec的结构如下:
另外有两个表在此没有体现出来,一个是三级类与参数关联表Product_spec,结构如下:
另一个是参数与产品的排列组合表Product_sku,结构如下:
/// <summary>
/// 参数条件筛选下的分页查询
/// </summary>
/// <param name="strWhere">查询条件</param>
/// <param name="pageSize">每页显示个数</param>
/// <param name="pageIndex">页码索引(第几页)</param>
/// <param name="filedOrder">排序</param>
/// <param name="recordCount">需返回的总数</param>
/// <returns></returns>
public DataSet GetList(string strWhere, int pageSize, int pageIndex, string filedOrder, out int recordCount)
{
string sql = "select ProductID,ProductName,ProductPic,ProductPrice,AddTime";
string list = "";
StringBuilder strSql = new StringBuilder();
if (strWhere != null && strWhere.Trim() != "")
{
strSql.Append("WITH List AS (" + sql);
strSql.Append(",spec_id from Product a inner join Product_relate_spec b on a.ProductID=b.product_id where prodAuditing=1");
}
else
{
strSql.Append(sql + " from Product where prodAuditing=1");
}
sql = strSql.ToString();
if (strWhere != null && strWhere.Trim() != "")
{
strSql.Append(")");
list = strSql.ToString();
string sql2 = " select ProductID,ProductName,ProductPic,ProductPrice,AddTime from List where ";
string str = "";
foreach (string s in strWhere.Split(','))
{
str += sql2 + s + " intersect ";
}
if (str.LastIndexOf("intersect") > -1)
{
sql = str.Substring(0, str.LastIndexOf(" intersect "));
sql = "select * from (" + sql + ") as T1";
}
}
recordCount = Convert.ToInt32(DataAccess.DC.GetSingle(list + PagingHelper.CreateCountingSql(sql)));
return DataAccess.DC.Query(list + PagingHelper.CreatePagingSql(recordCount, pageSize, pageIndex, sql, filedOrder));
}
实现思路是先将数据查询出存放到临时表List中,再根据传入的参数条件从临时表中查询数据,多个参数组合成多个sql语句,用intersect求这多个sql语句查询结果的交集。适当借助临时表,这样就可以实现多参数查询时也只访问一次数据库,提高查询效率。