/// <summary>
        /// Adds a request filter that includes entities where the request's requestCollection
        /// contains the entity's entityValue:
        ///     ie: Where(entity => request.requestCollection.Contains(entity.entityValue))
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddContainsFilter <TBuilder, TRequest, TEntity, TItem>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TRequest, ICollection <TItem> > > requestCollection,
            Expression <Func <TEntity, TItem> > entityValue,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var rParamExpr = Expression.Parameter(typeof(TRequest), "r");
            var eParamExpr = Expression.Parameter(typeof(TEntity), "e");

            var rCollectionExpr = requestCollection.Body.ReplaceParameter(requestCollection.Parameters[0], rParamExpr);
            var eValueExpr      = entityValue.Body.ReplaceParameter(entityValue.Parameters[0], eParamExpr);

            var containsInfo = typeof(Enumerable)
                               .GetMethods()
                               .Single(x => x.Name == nameof(Enumerable.Contains) && x.GetParameters().Length == 2)
                               .MakeGenericMethod(typeof(TItem));

            var rContainsExpr = Expression.Call(containsInfo, rCollectionExpr, eValueExpr);

            var filterClause = Expression.Quote(Expression.Lambda <Func <TEntity, bool> >(rContainsExpr, eParamExpr));
            var filterLambda = Expression.Lambda <Func <TRequest, Expression <Func <TEntity, bool> > > >(filterClause, rParamExpr);

            return(config.AddFilter(filterLambda.Compile(), condition));
        }
        /// <summary>
        /// Adds a request filter that includes entities where the provided comparator evaluates to
        /// true for the request's requestValue and the entity's entityValue:
        ///     ie: Where(entity => comparator(request.requestValue, entity.entityProp))
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddBinaryFilter <TBuilder, TRequest, TEntity, TRequestProp, TEntityProp>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TRequest, TRequestProp> > requestValue,
            Expression <Func <TEntity, TEntityProp> > entityValue,
            Expression <Func <TRequestProp, TEntityProp, bool> > comparator,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var riParamExpr = Expression.Parameter(typeof(TRequest), "ri");
            var eParamExpr  = Expression.Parameter(typeof(TEntity), "e");

            var rValueExpr = requestValue.Body.ReplaceParameter(requestValue.Parameters[0], riParamExpr);
            var eValueExpr = entityValue.Body.ReplaceParameter(entityValue.Parameters[0], eParamExpr);

            var filterBody = comparator.Body
                             .ReplaceParameter(comparator.Parameters[0], rValueExpr)
                             .ReplaceParameter(comparator.Parameters[1], eValueExpr);

            var filterExpr = Expression.Lambda <Func <TRequest, TEntity, bool> >(filterBody, riParamExpr, eParamExpr);

            var roParamExpr = Expression.Parameter(typeof(TRequest), "ro");
            var body        = filterExpr.Body.ReplaceParameter(filterExpr.Parameters[0], roParamExpr);

            var filterClause = Expression.Quote(Expression.Lambda <Func <TEntity, bool> >(body, filterExpr.Parameters[1]));
            var filterLambda = Expression.Lambda <Func <TRequest, Expression <Func <TEntity, bool> > > >(filterClause, roParamExpr);

            return(config.AddFilter(filterLambda.Compile(), condition));
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Adds an entity hook from the provided method.
 /// </summary>
 public static TBuilder AddEntityHook <TBuilder, TRequest, TEntity>(
     this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
     Action <TRequest, TEntity> hook)
     where TEntity : class
     where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
 {
     return(config.AddEntityHook(FunctionEntityHookFactory.From(hook)));
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Adds an audit hook from the provided method.
 /// </summary>
 public static TBuilder AddAuditHook <TBuilder, TRequest, TEntity>(
     this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
     Func <TRequest, TEntity, TEntity, CancellationToken, Task> hook)
     where TEntity : class
     where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
 {
     return(config.AddAuditHook(FunctionAuditHookFactory.From(hook)));
 }
 /// <summary>
 /// Adds a request filter that includes entities where the provided collection
 /// contains the entity's entityValue:
 ///     ie: Where(entity => collection.Contains(entity.entityValue))
 /// </summary>
 /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
 public static TBuilder AddContainsFilter <TBuilder, TRequest, TEntity, TItem>(
     this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
     ICollection <TItem> collection,
     Expression <Func <TEntity, TItem> > entityValue,
     Func <TRequest, bool> condition = null)
     where TEntity : class
     where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
 => config.AddContainsFilter(x => collection, entityValue, condition);
 /// <summary>
 /// Adds a request filter that includes entities where the provided comparator evaluates to
 /// true for the provided value and the entity's entityValue:
 ///     ie: Where(entity => comparator(value, entity.entityProp))
 /// </summary>
 /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
 public static TBuilder AddBinaryFilter <TBuilder, TRequest, TEntity, TValue, TEntityProp>(
     this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
     TValue value,
     Expression <Func <TEntity, TEntityProp> > entityValue,
     Expression <Func <TValue, TEntityProp, bool> > comparator,
     Func <TRequest, bool> condition = null)
     where TEntity : class
     where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
 => config.AddBinaryFilter(r => value, entityValue, comparator, condition);
Ejemplo n.º 7
0
        /// <summary>
        /// Adds a request filter that includes entities where the request's requestValue is
        /// less-than the entity's entityValue:
        ///     ie: Where(entity => request.requestValue < entity.entityValue)
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddLessThanFilter <TBuilder, TRequest, TEntity, TRequestProp, TEntityProp>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TRequest, TRequestProp> > requestValue,
            Expression <Func <TEntity, TEntityProp> > entityValue,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var filter = FilterHelpers.BuildBinaryFilter(requestValue, entityValue, Expression.LessThan);

            return(config.AddFilter(filter, condition));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Adds a request filter that includes entities where the entity's entityValue is not NULL:
        ///     ie: Where(entity => entity.entityValue != null)
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddNotNullFilter <TBuilder, TRequest, TEntity, TEntityProp>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TEntity, TEntityProp> > entityValue,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var filter = FilterHelpers.BuildUnaryFilter <TRequest, TEntity, TEntityProp>(entityValue,
                                                                                         expr => Expression.NotEqual(expr, Expression.Constant(default(TEntityProp), typeof(TEntityProp))));

            return(config.AddFilter(filter, condition));
        }
 /// <summary>
 /// Adds a request filter that includes entities where the filter predicate evaluates to true:
 ///     ie: Where(entity => filter(entity) == true)
 /// </summary>
 /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
 public static TBuilder AddFilter <TBuilder, TRequest, TEntity>(
     this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
     Expression <Func <TEntity, bool> > filter,
     Func <TRequest, bool> condition = null)
     where TEntity : class
     where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
 {
     return(condition == null
         ? config.AddRequestFilter((_, queryable) => queryable.Where(filter))
         : config.AddRequestFilter((request, queryable) =>
                                   condition(request) ? queryable.Where(filter) : queryable));
 }
Ejemplo n.º 10
0
        /// <summary>
        /// Adds a request filter that includes entities where the provided constant value is
        /// greater-than-or-equal to the entity's entityValue:
        ///     ie: Where(entity => value >= entity.entityValue)
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddGreaterThanOrEqualFilter <TBuilder, TRequest, TEntity, TValue, TEntityProp>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            TValue value,
            Expression <Func <TEntity, TEntityProp> > entityValue,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var filter = FilterHelpers.BuildUnaryFilter <TRequest, TEntity, TEntityProp>(entityValue,
                                                                                         expr => Expression.GreaterThanOrEqual(Expression.Constant(value, typeof(TValue)), expr));

            return(config.AddFilter(filter, condition));
        }
Ejemplo n.º 11
0
        public static TBuilder SortBy <TBuilder, TRequest, TEntity, TProperty>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Action <BasicSortBuilder <TRequest, TEntity> > sort)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new BasicSortBuilder <TRequest, TEntity>();

            sort(builder);

            var sorterFactory = builder.Build();

            return(config.SetSorter(sorterFactory));
        }
Ejemplo n.º 12
0
        public static TBuilder SortByDescending <TBuilder, TRequest, TEntity>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            string sortColumn)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new BasicSortBuilder <TRequest, TEntity>();

            builder.SortBy(sortColumn).Descending();

            var sorterFactory = builder.Build();

            return(config.SetSorter(sorterFactory));
        }
Ejemplo n.º 13
0
        public static TBuilder SortBy <TBuilder, TRequest, TEntity, TProperty>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TEntity, TProperty> > sortColumn)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new BasicSortBuilder <TRequest, TEntity>();

            builder.SortBy(sortColumn);

            var sorterFactory = builder.Build();

            return(config.SetSorter(sorterFactory));
        }
Ejemplo n.º 14
0
        public static TBuilder SortAsVariant <TBuilder, TRequest, TEntity, TSwitch>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Func <TRequest, TSwitch> getSwitchValue,
            Action <SwitchSortBuilder <TRequest, TEntity, TSwitch> > configure)
            where TEntity : class
            where TSwitch : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new SwitchSortBuilder <TRequest, TEntity, TSwitch>(getSwitchValue);

            configure(builder);

            return(config.SetSorter(builder.Build()));
        }
Ejemplo n.º 15
0
        public static TBuilder SortAsTable <TBuilder, TRequest, TEntity, TControl>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Func <TRequest, TControl> getControlValue,
            Action <TableSortBuilder <TRequest, TEntity, TControl> > configure)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new TableSortBuilder <TRequest, TEntity, TControl>()
                          .WithControl(getControlValue, SortDirection.Default);

            configure(builder);

            return(config.SetSorter(builder.Build()));
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Adds a request filter that includes entities where the predicate evaluates to true:
        ///     ie: Where((request, entity) => filter(request, entity) == true)
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddFilter <TBuilder, TRequest, TEntity>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TRequest, TEntity, bool> > filter,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var rParamExpr   = Expression.Parameter(typeof(TRequest), "r");
            var body         = filter.Body.ReplaceParameter(filter.Parameters[0], rParamExpr);
            var filterClause = Expression.Quote(Expression.Lambda <Func <TEntity, bool> >(body, filter.Parameters[1]));
            var filterLambda = Expression.Lambda <Func <TRequest, Expression <Func <TEntity, bool> > > >(filterClause, rParamExpr);

            return(config.AddFilter(filterLambda.Compile(), condition));
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Adds a request filter that includes entities where the provided collection
        /// contains the entity's entityValueMember:
        ///     ie: Where(entity => collection.Contains(entity.entityValueMember))
        /// </summary>
        /// <param name="condition">If condition is supplied, then the filter will only be applied when condition evaluates to true</param>
        public static TBuilder AddContainsFilter <TBuilder, TRequest, TEntity, TItem>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            ICollection <TItem> collection,
            string entityValueMember,
            Func <TRequest, bool> condition = null)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var eParamExpr  = Expression.Parameter(typeof(TEntity), "e");
            var body        = Expression.PropertyOrField(eParamExpr, entityValueMember);
            var entityValue = Expression.Lambda <Func <TEntity, TItem> >(body, eParamExpr);

            return(config.AddContainsFilter(x => collection, entityValue, condition));
        }
Ejemplo n.º 18
0
        public static TBuilder SortByDescending <TBuilder, TRequest, TEntity, TProperty>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> config,
            Expression <Func <TEntity, TProperty> > sortColumn,
            Action <BasicSortClauseBuilder <TRequest, TEntity> > andThen)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var builder = new BasicSortBuilder <TRequest, TEntity>();

            andThen(builder.SortBy(sortColumn).Descending());

            var sorterFactory = builder.Build();

            return(config.SetSorter(sorterFactory));
        }
Ejemplo n.º 19
0
        public static TBuilder BulkCreateWith <TRequest, TEntity, TBuilder>(
            this RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder> builder,
            Func <BulkInsertConfiguration <TEntity>, BulkInsertConfiguration <TEntity> > configure)
            where TEntity : class
            where TBuilder : RequestEntityConfigBuilderCommon <TRequest, TEntity, TBuilder>
        {
            var config = configure(new BulkInsertConfiguration <TEntity>());

            if (config != null)
            {
                BulkConfigurationManager.SetConfiguration(BulkConfigurationType.Insert, typeof(TRequest), typeof(TEntity), config);
            }

            return((TBuilder)builder);
        }