Как мне хранить значения Nullable и проходить через них? - PullRequest
0 голосов
/ 26 марта 2020

Спасибо, что нашли время. У меня есть URL Я пытаюсь построить параметры строки запроса из этих входных параметров, которые можно обнулять. Я думаю, что мне нужно сделать, это сохранить обнуляемые параметры в некотором типе списка generi c, а затем, если заданное значение параметра не равно нулю, добавить его в URL. Так, например, если они предоставляют строку ? state значение 'OH' мой URL будет выглядеть (http://www.thiscoolsiteJas.com/api/v1/moratorium?state=OH). Как мне это сделать ? Любой совет или направление будет принята с благодарностью. - Джейсон

 public  GetMoratoriums(string? state, int? system, DateTime? inEffectOn, bool? expired, int? reason) {
       //How do I build this with parameters  using the input parameters??
        string url = http://www.thiscoolsiteJas.com/api/v1/moratorium?";

}

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Как то так?

var queryStrings = new List<string>();

if (state.HasValue) { queryStrings.Add($"state={state.Value}"); }
if (system.HasValue) { queryStrings.Add($"system={system.Value}"); }
if (inEffectOn.HasValue) { queryStrings.Add($"inEffectOn={inEffectOn.Value}"); }
if (expired.HasValue) { queryStrings.Add($"expired={expired.Value}"); }
if (reason.HasValue) { queryStrings.Add($"reason={reason.Value}"); }

var result = @"http://www.thiscoolsiteJas.com/api/v1/moratorium";
if (queryStrings.Any()) { result += $"?{String.Join("&", queryStrings)}"; }
return result;
0 голосов
/ 27 марта 2020

Объектно-ориентированный подход;).

public class Parameter
{
    private readonly string _name;

    private readonly object _value;

    public Parameter(string name, object value)
    {
        _name = name;
        _value = value;
    }

    public string ForQuery()
    {
        return _value == null ? null : $"{_name}={_value}";
    }
}

Использование

string? state = "new_state";
int? system = 1;
DateTime? inEffectOn = default;
bool? expired = default;

var parameters = new[]
{
    new QueryParameter("state", state),
    new QueryParameter("system", system),
    new QueryParameter("inEffectOn", inEffectOn),
    new QueryParameter("expired", expired),
};

var queryParameters = parameters.Select(p => p.ForQuery()).Where(p => p != null);
var query = string.Join("&", queryParameters);

Например, вместо передачи длинного списка параметров вы можете передать коллекцию значений типа QueryParameter и запрос на сборку.

С методом расширения

public static string AppendTo(this IEnumerable<QueryParameter> parameters, string baseUrl) 
{
    return parameters
        .Select(p => p.ForQuery())
        .Where(p => p != null)
        .Aggregate(
            new StringBuilder(baseUrl),
            (builder, p) => builder.Append(p).Append("&"),
            (builder) => 
            {
                if (builder.Length > 0)
                {
                    builder.Insert(0, "?");
                    builder.Length -= 1; // remove last "&"
                }
            })
        .ToString();
}

Использование

var parameters = new[]
{
    new QueryParameter("state", "new"),
    new QueryParameter("system", null),
    new QueryParameter("inEffectOn", null),
    new QueryParameter("expired", false),
};

var url = parameters.AppendTo("http://www.thiscoolsiteJas.com/api/v1/moratorium");
0 голосов
/ 26 марта 2020

Я уверен, что есть лучший способ сделать это, но я бы справился с этим.

string url = http://www.thiscoolsiteJas.com/api/v1/moratorium?";

var queryStringParams = new List<KeyValuePair<string, string>>();

if (!string.IsNullOrEmpty(state))
   {
       queryStringParams.Add("state",state);
   }
etc...

var newUrl = new Uri(QueryHelpers.AddQueryString(url, queryStringParams));
...