Как построить динамическую строку из списка объектов? - PullRequest
0 голосов
/ 15 января 2019

Допустим, у меня есть список классов с именем Filter

 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);
        }
     }

Мне нужно, чтобы у меня был список фильтров, в которых имя столбца могло бы совпадать.

Таким образом, я мог иметь экземпляр 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 (...)

Ответы [ 2 ]

0 голосов
/ 15 января 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();
}

выход

enter image description here

0 голосов
/ 15 января 2019

Надеюсь, я вас правильно понял. Вы могли бы сделать

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)
...