You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将用户输入的单个词汇用于SQL的WHERE CONTAINS查询?

没问题,我帮你调整代码来实现CONTAINS格式的查询,同时处理用户输入的拆分和格式转换,还会提醒你需要注意的安全问题。

首先处理输入拆分与SQL构建逻辑

你提到的Split(' ')思路是对的,但要考虑用户输入多个空格的情况,避免生成空的查询项。另外,我们需要把每个拆分后的词汇用双引号包裹,再用OR连接起来,适配CONTAINS的语法要求。

修改后的代码(适配单个用户输入字符串)

如果你的搜索入口是单个用户输入的字符串(比如用户在搜索框里输入的一句话),可以这样写:

public List<Detail> Search(string userInput) {
    // 拆分输入,自动移除空字符串(处理多空格情况)
    var searchTerms = userInput.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).ToList();
    
    // 没有有效搜索词时返回空列表
    if (!searchTerms.Any()) {
        return new List<Detail>();
    }

    StringBuilder sqlBuilder = new StringBuilder();
    sqlBuilder.Append("select * from UH_QA.dbo.Answers WHERE CONTAINS(Question, '");
    
    // 把每个词汇用双引号包裹,并用OR连接
    var containsClause = string.Join(" OR ", searchTerms.Select(term => $"\"{term}\""));
    sqlBuilder.Append(containsClause);
    sqlBuilder.Append("')");

    return QueryList(sqlBuilder.ToString());
}

如果参数还是List类型

要是你还是需要接收List<string>格式的关键词列表,只需调整输入过滤部分:

public List<Detail> Search(List<string> information) {
    // 过滤掉空值和纯空白的关键词
    var validTerms = information.Where(term => !string.IsNullOrWhiteSpace(term)).ToList();
    
    if (!validTerms.Any()) {
        return new List<Detail>();
    }

    StringBuilder sqlBuilder = new StringBuilder();
    sqlBuilder.Append("select * from UH_QA.dbo.Answers WHERE CONTAINS(Question, '");
    
    var containsClause = string.Join(" OR ", validTerms.Select(term => $"\"{term}\""));
    sqlBuilder.Append(containsClause);
    sqlBuilder.Append("')");

    return QueryList(sqlBuilder.ToString());
}

重要提醒:SQL注入风险

上面的代码虽然实现了功能,但和你原来的写法一样,存在SQL注入的安全隐患——直接把用户输入拼接到SQL语句里,恶意用户可以构造输入来攻击你的数据库。

建议改成参数化查询,比如调整QueryList方法支持参数传入:

public List<Detail> Search(List<string> information) {
    var validTerms = information.Where(term => !string.IsNullOrWhiteSpace(term)).ToList();
    
    if (!validTerms.Any()) {
        return new List<Detail>();
    }

    var containsClause = string.Join(" OR ", validTerms.Select(term => $"\"{term}\""));
    // 使用参数化SQL,避免注入
    string sql = "select * from UH_QA.dbo.Answers WHERE CONTAINS(Question, @SearchTerms)";
    
    // 假设QueryList可以接收参数,这里用SqlParameter示例
    return QueryList(sql, new System.Data.SqlClient.SqlParameter("@SearchTerms", containsClause));
}

这样既实现了CONTAINS的查询逻辑,又能有效防范SQL注入,让你的搜索功能更可靠安全。

内容的提问来源于stack exchange,提问作者Harry Vella-Thompson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:27:58