Asp.Net 如何在查询中使用 'IN' 子句传递参数以优化搜索

Asp.Net How can I pass parameters using an 'IN' clause in the query to refine a search

我在 http://www.mikesdotnetting.com/article/156/webmatrix-database-helpers-for-in-clauses 的 IN 子句中关注 Mikes post,但我在添加其他参数时遇到了问题。根据他的 post,我从一些类别的复选框开始并且工作正常,但我为品牌添加了一些其他复选框但它不起作用。我不确定如何将附加参数传递给 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);

对于您在评论中提到的错误,请尝试从 db.Query 中删除参数 method.you 将字符串数组传递给 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;
  1. 检查 String.Format(sql, cIn, bIn) 的值 - 使它成为一个单独的字符串变量。您将看到在此 SQL 表达式中有重复的参数名称:@0、@1 等

  2. 调用db.Query时,执行:

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

其中 allTempcInbIn 的串联。

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