public async Task <SearchResult> Search(SearchRequest request) { if (request == null) { throw new Exception($"{request} cannot be null"); } RetsResource resource = await GetResourceMetadata(request.SearchType); if (resource == null) { string message = string.Format("The provided '{0}' is not valid. You can get a list of all valid value by calling '{1}' method on the Session object.", nameof(SearchRequest.SearchType), nameof(GetResourcesMetadata)); throw new Exception(message); } var uriBuilder = new UriBuilder(SearchUri); var query = HttpUtility.ParseQueryString(uriBuilder.Query); query.Add("SearchType", request.SearchType); query.Add("Class", request.Class); query.Add("QueryType", request.QueryType); query.Add("Count", request.Count.ToString()); query.Add("Format", request.Format); query.Add("Limit", request.Limit.ToString()); query.Add("StandardNames", request.StandardNames.ToString()); query.Add("RestrictedIndicator", request.RestrictedIndicator); query.Add("Query", request.ParameterGroup.ToString()); if (request.HasColumns()) { var columns = request.GetColumns().ToList(); if (!request.HasColumn(resource.KeyField)) { columns.Add(resource.KeyField); } query.Add("Select", string.Join(",", columns)); } uriBuilder.Query = query.ToString(); return(await Requester.Get(uriBuilder.Uri, async (response) => { using (Stream stream = await GetStream(response)) { XDocument doc = XDocument.Load(stream); int code = GetReplayCode(doc.Root); AssertValidReplay(doc.Root, code); var result = new SearchResult(resource, request.Class, request.RestrictedIndicator); if (code == 0) { char delimiterValue = GetCompactDelimiter(doc); XNamespace ns = doc.Root.GetDefaultNamespace(); XElement columns = doc.Descendants(ns + "COLUMNS").FirstOrDefault(); IEnumerable <XElement> records = doc.Descendants(ns + "DATA"); string[] tableColumns = columns.Value.Split(delimiterValue); result.SetColumns(tableColumns); foreach (var record in records) { string[] fields = record.Value.Split(delimiterValue); SearchResultRow row = new SearchResultRow(tableColumns, fields, resource.KeyField, request.RestrictedIndicator); result.AddRow(row); } } return result; } }, Session.Resource)); }