Asp.如何使用'IN'子句来优化搜索

本文关键字:优化 搜索 子句 IN Asp 何使用 | 更新日期: 2023-09-27 18:12:12

我在http://www.mikesdotnetting.com/article/156/webmatrix-database-helpers-for-in-clauses上遵循Mikes关于IN子句的帖子,但我在添加额外的参数时遇到了麻烦。根据他的帖子,我开始为类别添加一些复选框,工作得很好,但我为品牌添加了一些其他复选框,但它不起作用。我不确定如何传递额外的参数到in子句。

我想要完成的想法是有一个侧栏与不同的产品过滤器(类别,品牌,年龄,价格等),当用户点击它将更新结果。有人能帮我解决这个问题吗?

这是我正在使用的代码,但这会产生错误:

// for the categories
var cTemp = Request["categoryId"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var cParms = cTemp.Select((s, i) => "@" + i.ToString()).ToArray();
var cIn = string.Join(",", cParms);
// for the brands
var bTemp = Request["brandId"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var bParms = bTemp.Select((s, i) => "@" + i.ToString()).ToArray();
var bIn = string.Join(",", bParms);
var sql = "SELECT DISTINCT P.ProductID, J.CategoryID, J.BrandID, P.ProductName, P.Price, " +
       "FROM Products P " +
       "JOIN Junction J ON J.ProductID = P.ProductID " +
       "WHERE J.CategoryID IN ({0}) OR J.BrandID IN ({1})";
var products = db.Query(String.Format(sql, cIn, bIn), cTemp, bTemp);

Asp.如何使用'IN'子句来优化搜索

  1. 检查String.Format(sql, cIn, bIn)的值-使其成为一个单独的字符串变量。您将看到在这个SQL表达式中有重复的参数名:@0、@1等。

  2. 呼叫db.Query时:

db.Query(<final sql statement>, allTemp)

其中allTempcInbIn的串联。

第2项是您看到的错误的原因。

对于您在评论中提到的错误,尝试从db.Query方法中删除参数。您将字符串数组传递给SQL参数,这是不正确的。你的方法调用应该是这样的

var products = db.Query(String.Format(sql, cIn, bIn));

我认为你的WHERE条款处理也有错误。试试这样做…

var sql = "SELECT DISTINCT P.ProductID, J.CategoryID, J.BrandID, P.ProductName, P.Price, " +
       "FROM Products P " +
       "JOIN Junction J ON J.ProductID = P.ProductID ";
var whereClause = ""
if(!string.IsNullOrEmpty(cIn)||!string.IsNullOrEmpty(bIn))
{
    whereClause = "WHERE";
    if(!string.IsNullOrEmpty(cIn))
    {
        whereClause+=" J.CategoryID IN ({0}) ";
        if(!string.IsNullOrEmpty(bIn))
        whereClause+=" OR ";
    }
    if(!string.IsNullOrEmpty(bIn))
    {
        whereClause+=" J.BrandID IN ({1}) ";
    }
}
sql = sql+whereClause;