// T can be any type that derived from BaseResult and results are not change tracked // method could be used if we dont want to change track T here public async Task <ICommandResult <T> > RequestMergedResult <T>(object data = null) { DistinctCommandResult <T> result = new DistinctCommandResult <T>(); var response = await SendCommandAsync(data).ConfigureAwait(false); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { var serializer = new DocumentSerializer(db); result.Result = serializer.Deserialize <T>(stream); result.BaseResult = result.Result as BaseResult; } new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); return(result); }
// T can be any type // method should be used when base result is provided on server errors public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null, bool?throwForServerErrors = null) { DistinctCommandResult <T> result = new DistinctCommandResult <T>(); HttpResponseMessage response = null; if (onStreamReady == null) { response = await SendCommandAsync(data).ConfigureAwait(false); } else { response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false); } var serializer = new DocumentSerializer(db); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { if (EnableChangeTracking) { JObject jObject = null; result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T); if (response.IsSuccessStatusCode) { db.ChangeTracker.TrackChanges(result.Result, jObject); } } else { result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T); } // response has not BaseResult if If-None-Match point to a match revision (status: HttpStatusCode.NotModified) result.BaseResult = response.IsSuccessStatusCode == false && response.StatusCode != HttpStatusCode.NotModified ? serializer.Deserialize <BaseResult>(stream) : new BaseResult(); } if (throwForServerErrors.HasValue == false || throwForServerErrors.Value == true) { new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); } return(result); }
// T can be any type // method should be used when base result is provided on server errors public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null) { DistinctCommandResult <T> result = new DistinctCommandResult <T>(); HttpResponseMessage response = null; if (onStreamReady == null) { response = await SendCommandAsync(data).ConfigureAwait(false); } else { response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false); } var serializer = new DocumentSerializer(db); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { if (EnableChangeTracking) { JObject jObject = null; result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T); if (response.IsSuccessStatusCode) { db.ChangeTracker.TrackChanges(result.Result, jObject); } } else { result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T); } result.BaseResult = !response.IsSuccessStatusCode ? serializer.Deserialize <BaseResult>(stream) : new BaseResult { Code = (int)response.StatusCode }; } new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); return(result); }
public async Task <List <ICommandResult <T> > > RequestMultipleMergedResult <T>(object data = null) { var results = new List <ICommandResult <T> >(); var response = await SendCommandAsync(data).ConfigureAwait(false); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { var serializer = new DocumentSerializer(db); var _results = serializer.Deserialize <List <T> >(stream); foreach (var r in _results) { var distinctResult = new DistinctCommandResult <T> { Result = r, BaseResult = r as BaseResult }; results.Add(distinctResult); } } return(results); }