public static IIncludableSpecificationBuilder <TEntity, TProperty> ThenInclude <TEntity, TPreviousProperty, TProperty>(
            this IIncludableSpecificationBuilder <TEntity, TPreviousProperty> value,
            Expression <Func <TPreviousProperty, TProperty> > thenIncludeExpression)
            where TEntity : class
        {
            var propertyName = (thenIncludeExpression.Body as MemberExpression)?.Member?.Name;

            value.Aggregator.AddNavigationPropertyName(propertyName);

            return(new IncludableSpecificationBuilder <TEntity, TProperty>(value.Aggregator));
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <typeparam name="TPreviousProperty"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="previousBuilder"></param>
        /// <param name="thenIncludeExpression"></param>
        /// <returns></returns>
        public static IIncludableSpecificationBuilder <TEntity, TProperty> ThenInclude <TEntity, TPreviousProperty, TProperty>(
            this IIncludableSpecificationBuilder <TEntity, IEnumerable <TPreviousProperty> > previousBuilder,
            Expression <Func <TPreviousProperty, TProperty> > thenIncludeExpression)
            where TEntity : class
        {
            var info = new IncludeExpressionInfo(thenIncludeExpression, typeof(TEntity), typeof(TProperty), typeof(TPreviousProperty));

            ((List <IncludeExpressionInfo>)previousBuilder.Specification.IncludeExpressions).Add(info);

            var includeBuilder = new IncludableSpecificationBuilder <TEntity, TProperty>(previousBuilder.Specification);

            return(includeBuilder);
        }
        public static IIncludableSpecificationBuilder <TEntity, TProperty> ThenInclude <TEntity, TPreviousProperty, TProperty>(
            this IIncludableSpecificationBuilder <TEntity, IEnumerable <TPreviousProperty> > previousBuilder,
            Expression <Func <TPreviousProperty, TProperty> > thenIncludeExpression,
            bool condition)
            where TEntity : class
        {
            if (condition && !previousBuilder.IsChainDiscarded)
            {
                var info = new IncludeExpressionInfo(thenIncludeExpression, typeof(TEntity), typeof(TProperty), typeof(IEnumerable <TPreviousProperty>));

                ((List <IncludeExpressionInfo>)previousBuilder.Specification.IncludeExpressions).Add(info);
            }

            var includeBuilder = new IncludableSpecificationBuilder <TEntity, TProperty>(previousBuilder.Specification, !condition || previousBuilder.IsChainDiscarded);

            return(includeBuilder);
        }
 public static IIncludableSpecificationBuilder <TEntity, TProperty> ThenInclude <TEntity, TPreviousProperty, TProperty>(
     this IIncludableSpecificationBuilder <TEntity, TPreviousProperty> previousBuilder,
     Expression <Func <TPreviousProperty, TProperty> > thenIncludeExpression)
     where TEntity : class
 => ThenInclude(previousBuilder, thenIncludeExpression, true);