【问题标题】:C# Extension method to Convert into the comma separated [duplicate]C#扩展方法转换成逗号分隔[重复]
【发布时间】:2022-01-16 15:42:24
【问题描述】:

我有一些数据,例如name,firstname,surname,std,Rollno

使用C#,我想把它转换成

('name', 'surname', 'std', 'Rollno') 

这样我就可以使用这些数据来查询 SQL/MySQL 数据库,例如 -

SELECT *
FROM Table1 
WHERE UserCommunicationId IN ('name', 'surname', 'std', 'Rollno');

代替

SELECT *
FROM Table1 
WHERE UserCommunicationId IN ('name,surname,std,Rollno');

【问题讨论】:

  • 你有没有尝试过?如果是,请向我们展示您的尝试。
  • 还请了解SQL-Injection 以及如何轻松预防。
  • 即使您的问题不是直接重复的,但那里的答案可以帮助您做您需要的事情,而不是您要求的事情(这是一个安全风险)。

标签: c# extension-methods


【解决方案1】:

你可以试试下面的逻辑

public static class SQLQueryExtensions
{
    public static string ColumnFormat(this String str)
    {
        return "(" +                           //Include first parenthesis 
              string.Join(", ", str.Split().Select(x => $"'{x}'")) //Add single quote to each column
              + ")";                          //Include last parenthesis
    }
}

你也可以一行完成,

var inputStr = "name,firstname,surname,std,Rollno";
var result = "(" + string.Join(", ", inputStr.Split().Select(x => $"'{x}'")) + ")";

Try Online

【讨论】:

    【解决方案2】:

    使用打击逻辑,将解决您的问题。

    string inputStr = "name,firstname,surname,std,Rollno";  
    string result = string.Join(",", inputStr.Split(',').Select(x => string.Format("'{0}'", x)).ToList());
    Output = 'name','firstname','surname','std','Rollno'
    

    【讨论】:

    • 谢谢@rizwan - 这真的解决了问题
    【解决方案3】:

    我能想到的一种方法是:

    • 将整个字符串设置为查询参数。
    • 在 WITH 查询中拆分它。
    • 在主查询中左加入它。
    • NOT NULL 检查是否有任何命中。

    我在下面写了一个示例,但我是 Oracle 用户,所以我不确定这些语法是否正确,甚至没有经过测试,只是在谷歌上搜索了一下。 将其作为对思想解释的参考。

    WITH RECURSIVE targets (stringBuffer, word) AS (
    SELECT
      @Parameter
     ,NULL
    UNION ALL
    SELECT
      SUBSTRING(stringBuffer, LEAST(LENGTH(SUBSTRING_INDEX(stringBuffer, ',', 1) + 1, LENGTH(stringBuffer)))
     ,SUBSTRING_INDEX(stringBuffer, ',', 1)
    WHERE LENGTH(word) > 0
       OR LENGTH(stringBuffer) > 0      -- I am not really sure about these
    )
    
    SELECT *
    FROM Table1
    LEFT JOIN targets ON targets.word = Table1.UserCommunicationId
    WHERE targets.word IS NOT NULL;
    

    然后,在 C# 中,为您的查询命令设置参数,如下所示

    string s = "name,firstname,surname,std,Rollno";
    

    编辑:

    或者,简单地说:

    SELECT *
    FROM Table1 
    WHERE REGEXP_LIKE(UserCommunicationId, @Parameter)
    ;
    

    在 C# 中将参数设置为:

    string s = "name|firstname|surname|std|Rollno";
    

    请注意,如果关键字可以由用户输入,那么您仍然存在用户输入.+的问题,只要不添加其他条件,它就会响应每个数据。 p>

    但就我个人而言,如果您的查询中确实需要未知长度的 IN-CLAUSE,我认为您的设计存在潜在问题。如果可以应用的关键字数量有限,粗略但这是我团队当前的标准,您可以在 C# 中逐个关键字连接 WHERE 部分关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多