Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.Net如何使用';在';子句来优化搜索_C#_Asp.net_Razor_Web_Webmatrix - Fatal编程技术网

C# Asp.Net如何使用';在';子句来优化搜索

C# Asp.Net如何使用';在';子句来优化搜索,c#,asp.net,razor,web,webmatrix,C#,Asp.net,Razor,Web,Webmatrix,我正在关注Mikes关于的IN子句的帖子,但我在添加其他参数时遇到了问题。根据他的帖子,我从一些类别的复选框开始,效果很好,但我为品牌添加了一些其他复选框,但没有效果。我不确定如何将其他参数传递给in子句 我想要实现的想法是有一个带有不同产品过滤器(类别、品牌、年龄、价格等)的侧栏,当用户单击时,它将更新结果。有人能帮我做这个吗 这是我正在使用的代码,但会出现错误: // for the categories var cTemp = Request["categoryId"].Split(new

我正在关注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);

对于您在注释中提到的错误,请尝试从
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;
  • 检查
    String.Format(sql、cIn、bIn)的值
    -将其作为单独的字符串变量。您将看到此SQL表达式中有重复的参数名称:@0、@1等

  • 调用
    db.Query
    时,请执行以下操作:

  • db.Query(,allTemp)

    其中
    allTemp
    cIn
    bIn
    的串联


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

    您看到的错误是什么?这是cTemp、cParms、cIn返回的:cTemp:System.String[]cTemp::1 cParms:System.String[]cParms::@0 cIn:@0这是我得到的错误:异常详细信息:System.ArgumentException:DbType System.String[]不存在映射到一个已知的SqlCeType。第59行:var products=db.Query(String.Format(sql、cIn、bIn)、cTemp、bTemp)@阿尔文:尝试从查询方法调用中删除cTemp,bTemp。@黑暗骑士在那一行给了我一个错误:解析查询时出错。[Token line number=1,Token line offset=247,Token in error=WHERE]OP正在使用参数化sql语句-他必须将参数值传递给
    db.Query
    。这让我一开始也很困惑。
    String.Format
    的结果类似于
    @0、@1、@2…
    。这些是需要传入的预期参数,通过cTemp和bTemp提供。它们不是值本身。我不确定你的意思,你能告诉我你到底不明白什么吗?@alvin:定义
    sql
    变量后,添加行
    var tmp=String.Format(sql,cIn,bIn)。在该行(或其后面)设置断点,并查看
    tmp
    的值。我认为@Igor的意思是,您会发现它包含两次定义的
    @0
    等,因此您可能只会将
    cTemp
    中的值加载到
    语句中的两个
    bTemp
    可能会被忽略,或者至少会混淆一些东西。如果我错了,请纠正我。。。