using System.Collections.Generic;
public static void Main()
var prp = new ProviderRequestParameters();
var sps = new SearchParameterSet(prp);
Console.WriteLine(JsonConvert.SerializeObject(sps, Formatting.Indented));
public class SearchParameterSet
public ProviderRequestParameters ProviderParameters {get;set;}
private IList<string> patientIds = new List<string>();
public IList<string> PatientIds {get{return patientIds;} set {patientIds = value;}}
private IList<string> caseIds = new List<string>();
public IList<string> CaseIds {get{return caseIds;} set {caseIds = value;}}
public DateTime DateFrom {get;set;}
public DateTime DateTo {get;set;}
public string Profile {get;set;}
public string Format {get;set;}
public string ResourceType {get;set;}
public string User {get;set;}
public SearchParameterSet(ProviderRequestParameters requestParameters)
var rParams = requestParameters.RequestParameters;
ProviderParameters = requestParameters;
PatientIds.AddRange(RequestParameterHelper.GetValueOrDefault<IEnumerable<string>>(rParams, FhirRequestParameters.ByPatient, RequestParameterHelper.ReturnCsvStrings));
CaseIds.AddRange(RequestParameterHelper.GetValueOrDefault<IEnumerable<string>>(rParams, FhirRequestParameters.ByCase, RequestParameterHelper.ReturnCsvStrings));
DateFrom = RequestParameterHelper.GetValueOrDefault<DateTime>(rParams, FhirRequestParameters.ByDateFrom, RequestParameterHelper.ReturnDate);
DateTo = RequestParameterHelper.GetValueOrDefault<DateTime>(rParams, FhirRequestParameters.ByDateTo, RequestParameterHelper.ReturnDate);
Profile = RequestParameterHelper.GetValueOrDefault<string>(rParams, FhirRequestParameters.Profile, RequestParameterHelper.ReturnString);
Format = RequestParameterHelper.GetValueOrDefault<string>(rParams, FhirRequestParameters.Format, RequestParameterHelper.ReturnString);
ResourceType = RequestParameterHelper.GetValueOrDefault<string>(rParams, FhirRequestParameters.ResourceType, RequestParameterHelper.ReturnString);
User = RequestParameterHelper.GetValueOrDefault<string>(rParams, FhirRequestParameters.ByUser, RequestParameterHelper.ReturnString);
public static class RequestParameterHelper
public static T GetValueOrDefault<T>(IDictionary<string, string> requestParameters, string key, Func<string, T> parseValue)
var parameterName = FhirSearchExtensions.RequestParameterNames[key];
requestParameters.TryGetValue(parameterName, out value);
return parseValue(value);
public static string ReturnString(string value)
public static DateTime ReturnDate(string value)
return DateTime.TryParse(value, out result) ? result : DateTime.MinValue;
public static IEnumerable<string> ReturnCsvStrings(string value)
if (value == null) return Enumerable.Empty<string>();
return value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
public static class FhirRequestParameters
public static readonly string ByPatient = "patient";
public static readonly string ByCase = "case";
public static readonly string ByDateFrom = "datefrom";
public static readonly string ByDateTo = "dateto";
public static readonly string Profile = "profile";
public static readonly string Format = "format";
public static readonly string ResourceType = "resourceType";
public static readonly string ByUser = "user";
public static class FhirSearchExtensions
static FhirSearchExtensions()
RequestParameterNames = new Dictionary<string,string>()
{FhirRequestParameters.ByPatient, FhirRequestParameters.ByPatient}
,{FhirRequestParameters.ByCase, FhirRequestParameters.ByCase}
,{FhirRequestParameters.ByDateFrom, FhirRequestParameters.ByDateFrom}
,{FhirRequestParameters.ByDateTo, FhirRequestParameters.ByDateTo}
,{FhirRequestParameters.Profile, FhirRequestParameters.Profile}
,{FhirRequestParameters.Format, FhirRequestParameters.Format}
,{FhirRequestParameters.ResourceType, FhirRequestParameters.ResourceType}
,{FhirRequestParameters.ByUser, FhirRequestParameters.ByUser}
public static IDictionary<string, string> RequestParameterNames {get;set;}
public class ProviderRequestParameters
public IDictionary<string,string> RequestParameters{get {return DefaultValue();}}
IDictionary<string,string> DefaultValue()
return new Dictionary<string,string>()
{FhirRequestParameters.ByPatient, "patient1,patient2"}
,{FhirRequestParameters.ByDateFrom, "2018-09-02"}
,{FhirRequestParameters.ByDateTo, null}
,{FhirRequestParameters.Format, "Format 1"}
,{FhirRequestParameters.ResourceType, "RT1"}
,{FhirRequestParameters.ByUser, "The User"}
public static class IListExtension
public static void AddRange<T>(this IList<T> list, IEnumerable<T> items)
if (list == null) throw new ArgumentNullException("list");
if (items == null) throw new ArgumentNullException("items");
((List<T>)list).AddRange(items);
foreach (var item in items)