protected override IEnumerable EndExecuteSelect(IAsyncResult asyncResult)
        {
            ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Begin");

            if (_client == null)
            {
                ADXTrace.Instance.TraceInfo(TraceCategory.Application, "End: _client=null");

                return(null);
            }

            IEnumerable selectResult = null;
            int         rowsAffected = 0;

            try
            {
                SynchronousAsyncSelectResult syncResult = asyncResult as SynchronousAsyncSelectResult;

                if (syncResult != null)
                {
                    ADXTrace.Instance.TraceInfo(TraceCategory.Application, "syncResult");

                    selectResult = syncResult.SelectResult;
                }
                else
                {
                    ADXTrace.Instance.TraceInfo(TraceCategory.Application, "EndExecute");

                    if (!Owner.IsSingleSource)
                    {
                        var response = _execute != null?_execute.EndInvoke(asyncResult) : _executeFetchMultiple.EndInvoke(asyncResult);

                        if (response != null)
                        {
                            var entities = response.Entities;
                            rowsAffected = entities.Count;
                            selectResult = ExecuteSelect(entities).ToList();

                            if (Owner.CacheParameters.Enabled)
                            {
                                IEnumerable <string> dependencies;
                                string cacheKey;
                                if (Request.Query != null)
                                {
                                    dependencies = GetCacheDependencies(Request.Query, selectResult);
                                    cacheKey     = GetCacheKey(Request.Query);
                                }
                                else
                                {
                                    dependencies = GetCacheDependencies(Fetch, selectResult, Owner.IsSingleSource);
                                    cacheKey     = GetCacheKey(Request.Query);
                                }

                                // insert into cache
                                ObjectCacheManager.GetInstance().Insert(cacheKey, selectResult, dependencies);
                            }
                        }
                    }
                    else
                    {
                        var entity = _executeSingle.EndInvoke(asyncResult);
                        if (entity != null)
                        {
                            selectResult = ExecuteSelect(new [] { entity }).ToList();
                            if (Owner.CacheParameters.Enabled)
                            {
                                var dependencies = GetCacheDependencies(Fetch, selectResult, Owner.IsSingleSource);
                                var cacheKey     = GetCacheKey(Fetch.ToFetchExpression());

                                // insert into cache
                                ObjectCacheManager.GetInstance().Insert(cacheKey, selectResult, dependencies);
                            }
                        }
                    }
                }
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                ADXTrace.Instance.TraceError(TraceCategory.Application, string.Format("{0}\n\n{1}", ex.Detail.InnerXml, ex.ToString()));
            }
            catch (Exception e)
            {
                ADXTrace.Instance.TraceError(TraceCategory.Application, string.Format("Exception: {0}", e.ToString()));

                // raise post-event with exception
                CrmDataSourceStatusEventArgs selectedExceptionArgs = new CrmDataSourceStatusEventArgs(0, e);
                OnSelected(selectedExceptionArgs);

                if (!selectedExceptionArgs.ExceptionHandled)
                {
                    throw;
                }

                return(selectResult);
            }
            finally
            {
                _client = null;
            }

            // raise post-event
            CrmDataSourceStatusEventArgs selectedArgs = new CrmDataSourceStatusEventArgs(rowsAffected, null);

            OnSelected(selectedArgs);

            ADXTrace.Instance.TraceInfo(TraceCategory.Application, "End");

            return(string.IsNullOrEmpty(Owner.StaticEntityWrapperTypeName) ? selectResult : CreateEntities(selectResult));
        }
        protected override IEnumerable EndExecuteSelect(IAsyncResult asyncResult)
        {
            Tracing.FrameworkInformation("CrmDataSourceView", "EndExecuteSelect", "Begin");

            if (_client == null)
            {
                Tracing.FrameworkInformation("CrmDataSourceView", "EndExecuteSelect", "End: _client=null");

                return(null);
            }

            IEnumerable selectResult = null;
            int         rowsAffected = 0;

            try
            {
                SynchronousAsyncSelectResult syncResult = asyncResult as SynchronousAsyncSelectResult;

                if (syncResult != null)
                {
                    Tracing.FrameworkInformation("CrmDataSourceView", "EndExecuteSelect", "syncResult");

                    selectResult = syncResult.SelectResult;
                }
                else
                {
                    Tracing.FrameworkInformation("CrmDataSourceView", "EndExecuteSelect", "EndExecute");

                    var response = _execute.EndInvoke(asyncResult);

                    if (response != null)
                    {
                        var entities = response.Entities;
                        rowsAffected = entities.Count;
                        selectResult = ExecuteSelect(entities).ToList();

                        if (Owner.CacheParameters.Enabled)
                        {
                            var dependencies = GetCacheDependencies(Request.Query, selectResult);

                            string cacheKey = GetCacheKey(Request.Query);

                            // insert into cache
                            ObjectCacheManager.GetInstance().Insert(cacheKey, selectResult, dependencies);
                        }
                    }
                }
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                Tracing.FrameworkError("CrmDataSourceView", "EndExecuteSelect", "{0}\n\n{1}", ex.Detail.InnerXml, ex);
            }
            catch (Exception e)
            {
                Tracing.FrameworkError("CrmDataSourceView", "EndExecuteSelect", "Exception: {0}", e);

                // raise post-event with exception
                CrmDataSourceStatusEventArgs selectedExceptionArgs = new CrmDataSourceStatusEventArgs(0, e);
                OnSelected(selectedExceptionArgs);

                if (!selectedExceptionArgs.ExceptionHandled)
                {
                    throw;
                }

                return(selectResult);
            }
            finally
            {
                _client = null;
            }

            // raise post-event
            CrmDataSourceStatusEventArgs selectedArgs = new CrmDataSourceStatusEventArgs(rowsAffected, null);

            OnSelected(selectedArgs);

            Tracing.FrameworkInformation("CrmDataSourceView", "EndExecuteSelect", "End");

            return(string.IsNullOrEmpty(Owner.StaticEntityWrapperTypeName) ? selectResult : CreateEntities(selectResult));
        }