C# 扩展方法转换成逗号分隔

C# Extension method to Convert into the comma separated

我有一些数据,例如 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');

你可以试试下面的逻辑

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

我能想到的一种方法是:

  • 将整个字符串作为参数设置到查询中。
  • 在 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";

请注意,如果用户可以输入关键字,您仍然会遇到用户可以输入 .+ 的问题,只要没有其他关键字,它就会响应所有数据已添加条件。

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

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

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'