protected virtual void OnSelecting(CrmDataSourceSelectingEventArgs args)
        {
            EventHandler <CrmDataSourceSelectingEventArgs> handler = base.Events[EventSelecting] as EventHandler <CrmDataSourceSelectingEventArgs>;

            if (handler != null)
            {
                handler(this, args);
            }
        }
        protected override IAsyncResult BeginExecuteSelect(
            DataSourceSelectArguments arguments,
            AsyncCallback asyncCallback,
            object asyncState)
        {
            ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Begin");

            if (CanSort)
            {
                arguments.AddSupportedCapabilities(DataSourceCapabilities.Sort);
            }

            if (CanPage)
            {
                arguments.AddSupportedCapabilities(DataSourceCapabilities.Page);
            }

            if (CanRetrieveTotalRowCount)
            {
                arguments.AddSupportedCapabilities(DataSourceCapabilities.RetrieveTotalRowCount);
            }

            string           fetchXml;
            QueryByAttribute query;

            InitializeParameters(out fetchXml, out query);

            // raise pre-event
            CrmDataSourceSelectingEventArgs selectingArgs = new CrmDataSourceSelectingEventArgs(
                Owner,
                arguments,
                fetchXml,
                query);

            OnSelecting(selectingArgs);

            IEnumerable selectResult = null;

            if (selectingArgs.Cancel)
            {
                ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Cancel");
                return(new SynchronousAsyncSelectResult(selectResult, asyncCallback, asyncState));
            }

            // merge event results
            arguments.RaiseUnsupportedCapabilitiesError(this);
            fetchXml = selectingArgs.FetchXml;

            if (CancelSelectOnNullParameter && string.IsNullOrEmpty(fetchXml) && query == null)
            {
                ADXTrace.Instance.TraceInfo(TraceCategory.Application, "CancelSelectOnNullParameter");
                return(new SynchronousAsyncSelectResult(selectResult, asyncCallback, asyncState));
            }

            try
            {
                _client = OrganizationServiceContextFactory.Create(Owner.CrmDataContextName);

                if (!string.IsNullOrEmpty(fetchXml))
                {
                    var fetch = ToFetch(arguments, fetchXml);

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

                    return(ExecuteSelect(_client, null, fetch, asyncCallback, asyncState));
                }

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

                    // the SortExpression has high priority, apply it to the query
                    AppendSortExpressionToQuery(arguments.SortExpression, order => query.Orders.Add(order));

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

                    return(ExecuteSelect(_client, query, null, asyncCallback, asyncState));
                }
            }
            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()));

                _client = null;

                return(new SynchronousAsyncSelectResult(e, asyncCallback, asyncState));
            }

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

            return(new SynchronousAsyncSelectResult(selectResult, asyncCallback, asyncState));
        }