private async Task <HttpRequestMessage> QueryToHttpRequest(QueryBase queryBase) { switch (queryBase) { case FetchExpression query: { using (var input = new StringReader(query.Query)) using (var reader = XmlReader.Create(input)) { reader.ReadToFollowing("entity"); var entityName = reader.GetAttribute("name"); var metadata = await GetEntityMetadata(entityName); var entity = metadata.LogicalCollectionName; return(new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/{entity}?fetchXml={query.Query}")); } } case QueryExpression query: { var metadata = await GetEntityMetadata(query.EntityName); var entity = metadata.LogicalCollectionName; var visitor = new ODataQueryExpressionVisitor(); visitor.Visit(query); return(new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/{entity}?{visitor.QueryString}")); } case QueryByAttribute query: { var queryExpression = new QueryExpression(query.EntityName) { TopCount = query.TopCount, PageInfo = query.PageInfo, ColumnSet = query.ColumnSet }; queryExpression.Orders.AddRange(query.Orders); for (var i = 0; i < query.Attributes.Count; i++) { var attribute = query.Attributes[i]; var value = query.Values[i]; queryExpression.Criteria.AddCondition(attribute, ConditionOperator.Equal, value); } return(await QueryToHttpRequest(queryExpression)); } default: { throw new NotSupportedException("Query type is not supported."); } } }
private async Task <HttpRequestMessage> ToHttpRequest(OrganizationRequest orgRequest) { switch (orgRequest) { case ExecuteMultipleRequest request: { var message = new HttpRequestMessage(HttpMethod.Post, $"{_baseUrl}/$batch"); var batchId = $"batch_{Guid.NewGuid().ToString("N")}"; var batch = new MultipartContent("mixed", batchId); foreach (var req in request.Requests) { var changesetId = $"changeset_{Guid.NewGuid().ToString("N")}"; var changeset = new MultipartContent("mixed", changesetId); changeset.Headers.Remove("Content-Type"); changeset.Headers.Add("Content-Type", $"multipart/mixed;boundary={changesetId}"); var change = await ToHttpRequest(req); var content = new HttpMessageContent(change); content.Headers.Remove("Content-Type"); content.Headers.Add("Content-Type", $"application/http"); content.Headers.Add("Content-Transfer-Encoding", "binary"); content.Headers.Add("Content-ID", "1"); changeset.Add(content); batch.Add(changeset); } message.Content = batch; return(message); } case CreateRequest request: { var target = request.Target; var metadata = await GetEntityMetadata(target.LogicalName); var entitySetName = metadata.LogicalCollectionName; var message = new HttpRequestMessage(HttpMethod.Post, $"{_baseUrl}/{entitySetName}"); var body = JsonConvert.SerializeObject(request.Target.Attributes.ToDictionary(x => x.Key, x => x.Value)); message.Content = new StringContent(body, Encoding.UTF8, "application/json"); return(message); } case RetrieveRequest request: { var target = request.Target; var metadata = await GetEntityMetadata(target.LogicalName); var entity = metadata.LogicalCollectionName; var query = new QueryExpression(target.LogicalName) { ColumnSet = request.ColumnSet }; var visitor = new ODataQueryExpressionVisitor(); visitor.Visit(query); return(new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/{entity}({target.Id})?{visitor.QueryString}")); } case RetrieveMultipleRequest request: { return(await QueryToHttpRequest(request.Query)); } case DeleteRequest request: { var target = request.Target; var metadata = await GetEntityMetadata(target.LogicalName); var entity = metadata.LogicalCollectionName; return(new HttpRequestMessage(HttpMethod.Delete, $"{_baseUrl}/{entity}({target.Id})")); } } return(null); }