如何从循环中删除额外的 AND
Posted
技术标签:
【中文标题】如何从循环中删除额外的 AND【英文标题】:how to remove the extra AND from the loop 【发布时间】:2013-01-10 18:36:45 【问题描述】:foreach (string word in allTheseWords)
allTheseStringsWhereClause = allTheseStringsWhereClause +
" report=" +
word +
" AND ";
问题是在循环之后,SQL 子句末尾多了一个AND
。
我该如何解决这个问题?
【问题讨论】:
不要通过连接字符串生成 SQL。它容易受到 SQL 注入的攻击。 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 是否需要编辑? 【参考方案1】:您也可以使用LINQ
string _final = string.Join(" AND ", (allTheseWords.Select(x => "report=" + x)));
【讨论】:
您使用了错误的变量。allTheseStringsWhereClause
是一个字符串。单词在allTheseWords
变量中。【参考方案2】:
通过将用户输入插入到 sql where 子句中,您将引入 SQL 注入攻击的向量。不要使用这种方法。基本上你想使用 SQL 参数。
where report in @allTheseWords
见http://en.wikipedia.org/wiki/SQL_injection
编辑
请参阅Parameterize an SQL IN clause 中投票最多的答案,了解如何真正在查询中进行参数化。
【讨论】:
问题是关于字符串操作,而不是 SQL 最佳实践。这不是对他问题的回答,最好是作为对问题的评论而不是答案。 @TimothyStrimple,我非常不同意。 OP 特别提到了allTheseStringsWhereClause
,这意味着一个 SQL where 子句。这是错误,必须更正。
呃。哪个数据库允许您将数组作为参数传递?
@RichardSchneider 如果 OP 所指的 WHERE
子句用于过滤数据集怎么办?无论如何,这仍然是 NOT 参数化 IN
子句的正确方法。
@Random832。抱歉,我只是采取简单的方法而不进行研究(我总是使用 ORM),这就是我说的基本原因)。但是现在在***.com/questions/337704/… 中查看得票最多的答案【参考方案3】:
这种问题很常见,这里就是证明。
-
Delete last char of string
How to delete last character in a string in C#?
Finding the last index of an array
但这是我的简单解决方案
string[] allTheseWords = "try", "test", "let" ;
string whereLine = string.Empty;
foreach (var item in allTheseWords)
whereLine += "report = " + item.ToString() + " and ";
string final = whereLine.Remove(whereLine.Length - 5);
Console.WriteLine(final);
Console.ReadLine();
【讨论】:
【参考方案4】:一个简单的方法是添加一个虚假的 always-true 子句(并移动 AND):
string allTheseStringsWhereClause = "WHERE 1=1";
foreach (string word in allTheseWords)
allTheseStringsWhereClause = allTheseStringsWhereClause +
" AND report=" +
word;
【讨论】:
【参考方案5】:您不需要 LINQ,只需使用 Join
:
string whereClause = " report=" + String.Join(" AND report=", allTheseWords);
【讨论】:
【参考方案6】:无需对子字符串方法进行硬编码的最佳方法是尝试聚合 LINQ 查询
var result = allTheseWords.Aggregate(allTheseStringsWhereClause, (current, word) => current + " report=" + word + " AND ");
【讨论】:
【参考方案7】:简单。您只需要执行 allTheseStringsWhereClause.substr(0,-4) 即可!
【讨论】:
以上是关于如何从循环中删除额外的 AND的主要内容,如果未能解决你的问题,请参考以下文章