/// <summary>
        /// 
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns></returns>
        protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
        {
            if (owner.SelectFunction == null)
                throw new DelegateNotFoundException("SelectFunction", "The select function doesn't implemented.");

            arguments.RaiseUnsupportedCapabilitiesError(this);

            var eventArg = new SelectingEventArgs(arguments, this.GetSelectParameters(), owner.SourceType);
            owner.OnSelecting(eventArg);
            if (eventArg.Cancel)
                return null;

            var selectActionEvent = new ActionEventArgs<SelectingEventArgs, IPagingResult>(eventArg, owner.SelectFunction);

            IPagingResult paging = selectActionEvent.Execute();
            if (paging.QueryException != null)
            {
                owner.OnExecutionQueryError(new QueryResultEventArgs(paging));
                return null;
            }

            IEnumerable result = paging.Result;
            arguments.TotalRowCount = paging.TotalRowCount;
            owner.OnSelected(EventArgs.Empty);

            return result;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="keys"></param>
        /// <param name="oldValues"></param>
        /// <returns></returns>
        protected override int ExecuteDelete(IDictionary keys, IDictionary oldValues)
        {
            if (owner.DeleteFunction == null)
                throw new DelegateNotFoundException("DeleteFunction", "The delete function doesn't implemented.");

            if (owner.IdentifierFunction == null)
                throw new DelegateNotFoundException("IdentifierFunction", "The identifier function doesn't implemented.");

            var eventArg = new DeletingEventArgs(owner.SourceType, owner.IdentifierFunction.Invoke(keys));
            owner.OnDeleting(eventArg);

            if (eventArg.Cancel)
                return 0;

            var deletingActionEvent = new ActionEventArgs<DeletingEventArgs, IPersisterResult>(eventArg, owner.DeleteFunction);

            var result = deletingActionEvent.Execute();
            if (result.QueryException != null)
            {
                owner.OnExecutionQueryError(new QueryResultEventArgs(result));
                return -1;
            }

            owner.OnDeleted(EventArgs.Empty);
            OnDataSourceViewChanged(EventArgs.Empty);
            return 1;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        protected override int ExecuteInsert(IDictionary values)
        {
            if (owner.SaveFunction == null)
                throw new DelegateNotFoundException("SaveFunction", "The insert function doesn't implemented.");

            var eventArg = new SavingEventArgs(owner.SourceType, values);
            owner.OnInserting(eventArg);

            if (eventArg.Cancel)
                return 0;

            var insertingActionEvent = new ActionEventArgs<SavingEventArgs, IPersisterResult>(eventArg, owner.SaveFunction);

            try
            {
                var result = insertingActionEvent.Execute();
                if (result.QueryException != null)
                {
                    owner.OnExecutionQueryError(new QueryResultEventArgs(result));
                    return -1;
                }

                owner.OnInserted(EventArgs.Empty);
                OnDataSourceViewChanged(EventArgs.Empty);
            }
            catch (Exception)
            {
                return -1;
            }
            return 1;
        }