如何在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
相关产品推荐
相关产品推荐

