Esempio n. 1
0
        /// <summary>
        /// Notifies interceptor about QueryCreating stage in query execution.
        /// </summary>
        /// <param name="e">
        /// The <see cref="LogicSoftware.DataAccess.Repository.Extended.Events.QueryCreatingEventArgs"/> instance containing the event data.
        /// </param>
        /// <param name="context">
        /// The context.
        /// </param>
        /// <returns>
        /// <c>true</c>, if at least one interceptor has been executed, <c>false</c> otherwise.
        /// </returns>
        public bool OnQueryCreating(QueryCreatingEventArgs e, QueryContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            // no suitable interceptors found
            if (context.Interceptors.Count == 0)
            {
                return(false);
            }

            // intercept
            context.Interceptors.ForEach(pair => pair.Value.OnQueryCreating(e));

            return(true);
        }
Esempio n. 2
0
        public TResult Execute <TResult>(QueryContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            this.ExtensionsProvider.InitializeQueryContext(context);

            // first pass. processing all extension-specific method calls only
            Expression firstPassOutputExpression = this.Visit(context.Expression, context);

            // QueryCreating stage
            var queryCreating = new QueryCreatingEventArgs(firstPassOutputExpression);

            this.ExtensionsProvider.OnQueryCreating(queryCreating, context);

            // LoadOptionsCreating stage
            var loadOptionsCreating = new LoadOptionsCreatingEventArgs(queryCreating.Expression, new LoadOptions());

            this.ExtensionsProvider.OnLoadOptionsCreating(loadOptionsCreating, context);

            // getting original query from repository
            var originalQuery = this.Repository.All(context.ElementType, loadOptionsCreating.LoadOptions);

            // QueryCreated stage
            var queryCreated = new QueryCreatedEventArgs(originalQuery);

            this.ExtensionsProvider.OnQueryCreated(queryCreated, context);

            // concatenating expression after load options creating event with expression after query created event
            Expression readyToExecuteExpression = new ExpressionConstantReplacer(context.RootQuery, queryCreated.Query.Expression).Visit(loadOptionsCreating.Expression);

            // PreExecute stage
            var preExecute = new PreExecuteEventArgs(readyToExecuteExpression);

            this.ExtensionsProvider.OnPreExecute(preExecute, context);

            return(this.ExecuteCore <TResult>(originalQuery, context, preExecute.Expression));
        }
Esempio n. 3
0
 /// <summary>
 /// The QueryCreating stage handler.
 /// </summary>
 /// <param name="e">
 /// The <see cref="LogicSoftware.DataAccess.Repository.Extended.Events.QueryCreatingEventArgs"/> instance containing the event data.
 /// </param>
 /// <remarks>
 /// Base implementation is empty.
 /// </remarks>
 public virtual void OnQueryCreating(QueryCreatingEventArgs e)
 {
 }