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;
检查 String.Format(sql, cIn, bIn)
的值 - 使它成为一个单独的字符串变量。您将看到在此 SQL 表达式中有重复的参数名称:@0、@1 等
调用db.Query
时,执行:
db.Query(<final sql statement>, allTemp)
其中 allTemp
是 cIn
和 bIn
的串联。
第 2 项是导致您看到的错误的原因。
我在 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;
检查
String.Format(sql, cIn, bIn)
的值 - 使它成为一个单独的字符串变量。您将看到在此 SQL 表达式中有重复的参数名称:@0、@1 等调用
db.Query
时,执行:
db.Query(<final sql statement>, allTemp)
其中 allTemp
是 cIn
和 bIn
的串联。
第 2 项是导致您看到的错误的原因。