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}'")) + ")";
我能想到的一种方法是:
- 将整个字符串作为参数设置到查询中。
- 在 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'
我有一些数据,例如 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}'")) + ")";
我能想到的一种方法是:
- 将整个字符串作为参数设置到查询中。
- 在 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'