如何从对象列表构建动态字符串?
How to build a dynamic string from a List of Objects?
假设我有一个名为 Filter
的 class 列表
public class Filter
{
[JsonProperty("field")]
public string ColumnName { get; set; }
[JsonProperty("value")]
public string ColumnValue { get; set; }
[JsonProperty("operator")]
public object Operator {get; set;}
public override string ToString()
{
return String.Format("{0} in ('{1}')", this.ColumnName, this.ColumnValue);
}
}
我需要一个过滤器列表,其中列名可以相同。
因此,对于列表中 class 的每个实例,我可以多次拥有一个 ColumnName "LoanNumber" 的实例。每个 LoanNumber 将具有完全不同的值。所以我需要收集所有的值并将它们放在一个 LoanNumber 下作为 In 子句字符串。
如何遍历过滤器列表并构建如下所示的字符串
string where = "LoanNum in (1234,456, 55676) and Dates in (01/01/2019, 01/02/2019)";
到目前为止,我无法让所有数据都像上面那样
private string CreateWhereClause(List<Filter> filter)
{
StringBuilder sb = new StringBuilder();
foreach(var f in filter)
{
if (!sb.ToString().Contains(f.ColumnName))
{
sb.Append(f.ToString() + " AND ");
}else
{
sb.Append(f.ToString() + " AND ");
}
}
sb.Remove(sb.Length - 4, 4);
return sb.ToString();
}
上面的问题是我得到一个看起来像这样的字符串
LoanNum in (1234) and LoanNum in (3456) and Dates in (...) and Dates in (...)
,
希望我理解正确。你可以做
var list = new List<Filter>
{
new Filter{ColumnName="LoanNum",ColumnValue="1234"},
new Filter{ColumnName="Dates",ColumnValue="01/01/2019"},
new Filter{ColumnName="LoanNum",ColumnValue="456"},
new Filter{ColumnName="Dates",ColumnValue="01/02/2019"},
new Filter{ColumnName="LoanNum",ColumnValue="55676"},
};
var subResult = list
.GroupBy(filter => filter.ColumnName)
.Select(group => string.Format("{0} in ({1})", group.Key,
string.Join(",", group.Select(filter => filter.ColumnValue))));
var where = string.Join(" and ", subResult);
输出
LoanNum in (1234,456,55676) and Dates in (01/01/2019,01/02/2019)
我相信 GroupBy
和 Select
是最好的方法,但是如果您想知道如何在开始时循环执行它,一种方法是使用字典,其中 Key
是 ColumnName
,Value
是相关 ColumnValue
字符串的逗号分隔列表:
private static string CreateWhereClause(List<Filter> filters)
{
if (filters == null) return null;
if (!filters.Any()) return string.Empty;
var results = new Dictionary<string, string>();
foreach (var filter in filters)
{
if (results.ContainsKey(filter.ColumnName))
{
results[filter.ColumnName] += $",'{filter.ColumnValue}'";
}
else
{
results.Add(filter.ColumnName, $"'{filter.ColumnValue}'");
}
}
return string.Join(" AND ", results.Select(result =>
$"{result.Key} IN ({result.Value})"));
}
使用它可能看起来像:
private static void Main()
{
var filters = new List<Filter>
{
new Filter {ColumnName = "LoanNum", ColumnValue = "1234"},
new Filter {ColumnName = "Dates", ColumnValue = "01/01/2019"},
new Filter {ColumnName = "LoanNum", ColumnValue = "456"},
new Filter {ColumnName = "Dates", ColumnValue = "01/02/2019"},
new Filter {ColumnName = "LoanNum", ColumnValue = "55676"},
};
var query = $"SELECT LOANS WHERE {CreateWhereClause(filters)}";
Console.WriteLine(query);
Console.ReadKey();
}
输出
假设我有一个名为 Filter
的 class 列表 public class Filter
{
[JsonProperty("field")]
public string ColumnName { get; set; }
[JsonProperty("value")]
public string ColumnValue { get; set; }
[JsonProperty("operator")]
public object Operator {get; set;}
public override string ToString()
{
return String.Format("{0} in ('{1}')", this.ColumnName, this.ColumnValue);
}
}
我需要一个过滤器列表,其中列名可以相同。
因此,对于列表中 class 的每个实例,我可以多次拥有一个 ColumnName "LoanNumber" 的实例。每个 LoanNumber 将具有完全不同的值。所以我需要收集所有的值并将它们放在一个 LoanNumber 下作为 In 子句字符串。
如何遍历过滤器列表并构建如下所示的字符串
string where = "LoanNum in (1234,456, 55676) and Dates in (01/01/2019, 01/02/2019)";
到目前为止,我无法让所有数据都像上面那样
private string CreateWhereClause(List<Filter> filter)
{
StringBuilder sb = new StringBuilder();
foreach(var f in filter)
{
if (!sb.ToString().Contains(f.ColumnName))
{
sb.Append(f.ToString() + " AND ");
}else
{
sb.Append(f.ToString() + " AND ");
}
}
sb.Remove(sb.Length - 4, 4);
return sb.ToString();
}
上面的问题是我得到一个看起来像这样的字符串
LoanNum in (1234) and LoanNum in (3456) and Dates in (...) and Dates in (...)
,
希望我理解正确。你可以做
var list = new List<Filter>
{
new Filter{ColumnName="LoanNum",ColumnValue="1234"},
new Filter{ColumnName="Dates",ColumnValue="01/01/2019"},
new Filter{ColumnName="LoanNum",ColumnValue="456"},
new Filter{ColumnName="Dates",ColumnValue="01/02/2019"},
new Filter{ColumnName="LoanNum",ColumnValue="55676"},
};
var subResult = list
.GroupBy(filter => filter.ColumnName)
.Select(group => string.Format("{0} in ({1})", group.Key,
string.Join(",", group.Select(filter => filter.ColumnValue))));
var where = string.Join(" and ", subResult);
输出
LoanNum in (1234,456,55676) and Dates in (01/01/2019,01/02/2019)
我相信 GroupBy
和 Select
是最好的方法,但是如果您想知道如何在开始时循环执行它,一种方法是使用字典,其中 Key
是 ColumnName
,Value
是相关 ColumnValue
字符串的逗号分隔列表:
private static string CreateWhereClause(List<Filter> filters)
{
if (filters == null) return null;
if (!filters.Any()) return string.Empty;
var results = new Dictionary<string, string>();
foreach (var filter in filters)
{
if (results.ContainsKey(filter.ColumnName))
{
results[filter.ColumnName] += $",'{filter.ColumnValue}'";
}
else
{
results.Add(filter.ColumnName, $"'{filter.ColumnValue}'");
}
}
return string.Join(" AND ", results.Select(result =>
$"{result.Key} IN ({result.Value})"));
}
使用它可能看起来像:
private static void Main()
{
var filters = new List<Filter>
{
new Filter {ColumnName = "LoanNum", ColumnValue = "1234"},
new Filter {ColumnName = "Dates", ColumnValue = "01/01/2019"},
new Filter {ColumnName = "LoanNum", ColumnValue = "456"},
new Filter {ColumnName = "Dates", ColumnValue = "01/02/2019"},
new Filter {ColumnName = "LoanNum", ColumnValue = "55676"},
};
var query = $"SELECT LOANS WHERE {CreateWhereClause(filters)}";
Console.WriteLine(query);
Console.ReadKey();
}
输出