/// <summary>
        /// core build query function. start point
        /// </summary>
        /// <param name="expr"></param>
        /// <param name="paginate"></param>
        /// <param name="isCountQuery"></param>
        /// <param name="remoteGrouping"></param>
        /// <returns></returns>
        Expression BuildCore(Expression expr, bool paginate = false, bool isCountQuery = false, bool remoteGrouping = false)
        {
            var queryableType        = typeof(Queryable);
            var genericTypeArguments = new[] { typeof(T) };

            // call expression with filter
            if (_loadOptions.HasFilter)
            {
                expr = Expression.Call(queryableType, "Where", genericTypeArguments, expr, Expression.Quote(new FilterExpressionCompiler <T>(_guardNulls).Compile(_loadOptions.Filter)));
            }

            if (!isCountQuery)
            {
                if (!remoteGrouping)
                {
                    if (_loadOptions.HasAnySort)
                    {
                        expr = new SortExpressionCompiler <T>(_guardNulls).Compile(expr, _loadOptions.GetFullSort());
                    }
                    if (_loadOptions.HasAnySelect && _loadOptions.UseRemoteSelect)
                    {
                        expr = new SelectExpressionCompiler <T>(_guardNulls).Compile(expr, _loadOptions.GetFullSelect());
#if (NET40)
                        genericTypeArguments = expr.Type.GetGenericArguments();
#elif (NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETSTANDARD2_0)
                        genericTypeArguments = expr.Type.GetTypeInfo().IsGenericTypeDefinition ? expr.Type.GetTypeInfo().GenericTypeParameters : expr.Type.GetTypeInfo().GenericTypeArguments;
#elif (NETCOREAPP1_0 || NETCOREAPP1_1 || NETCOREAPP2_0 || NETCOREAPP2_1)
                        IEnumerable <Type> arguments = expr.Type.IsGenericTypeDefinition
                                ? expr.Type.GenericTypeParameters
                                : expr.Type.GenericTypeArguments;
                        genericTypeArguments = arguments.Select(x => x.GetTypeInfo()).ToArray();
#endif
                    }
                }
                else
                {
                    expr = new RemoteGroupExpressionCompiler <T>(_guardNulls, _loadOptions.Group, _loadOptions.TotalSummary, _loadOptions.GroupSummary).Compile(expr);
                }

                if (paginate)
                {
                    if (_loadOptions.Skip > 0)
                    {
                        expr = Expression.Call(queryableType, "Skip", genericTypeArguments, expr, Expression.Constant(_loadOptions.Skip));
                    }

                    if (_loadOptions.Take > 0)
                    {
                        expr = Expression.Call(queryableType, "Take", genericTypeArguments, expr, Expression.Constant(_loadOptions.Take));
                    }
                }
            }

            if (isCountQuery)
            {
                expr = Expression.Call(queryableType, "Count", genericTypeArguments, expr);
            }

            return(expr);
        }
Exemplo n.º 2
0
        Expression BuildCore(Expression expr, bool paginate = false, bool isCountQuery = false, bool remoteGrouping = false, IList filterOverride = null, IReadOnlyList <string> selectOverride = null)
        {
            var queryableType        = typeof(Queryable);
            var genericTypeArguments = new[] { typeof(T) };

            if (filterOverride != null || _context.HasFilter)
            {
                var filterExpr = filterOverride != null && filterOverride.Count < 1
                    ? Expression.Lambda(Expression.Constant(false), Expression.Parameter(typeof(T)))
                    : new FilterExpressionCompiler <T>(_guardNulls, _context.UseStringToLower).Compile(filterOverride ?? _context.Filter);

                expr = Expression.Call(queryableType, "Where", genericTypeArguments, expr, Expression.Quote(filterExpr));
            }

            if (!isCountQuery)
            {
                if (!remoteGrouping)
                {
                    if (_context.HasAnySort)
                    {
                        expr = new SortExpressionCompiler <T>(_guardNulls).Compile(expr, _context.GetFullSort());
                    }
                    if (selectOverride != null || _context.HasAnySelect && _context.UseRemoteSelect)
                    {
                        expr = new SelectExpressionCompiler <T>(_guardNulls).Compile(expr, selectOverride ?? _context.FullSelect);
                        genericTypeArguments = expr.Type.GetGenericArguments();
                    }
                }
                else
                {
                    expr = new RemoteGroupExpressionCompiler <T>(_guardNulls, _anonTypeNewTweaks, _context.Group, _context.TotalSummary, _context.GroupSummary).Compile(expr);
                }

                if (paginate)
                {
                    if (_context.Skip > 0)
                    {
                        expr = Expression.Call(queryableType, "Skip", genericTypeArguments, expr, Expression.Constant(_context.Skip));
                    }

                    if (_context.Take > 0)
                    {
                        expr = Expression.Call(queryableType, "Take", genericTypeArguments, expr, Expression.Constant(_context.Take));
                    }
                }
            }

            if (isCountQuery)
            {
                expr = Expression.Call(queryableType, "Count", genericTypeArguments, expr);
            }

            return(expr);
        }
        Expression BuildCore(Expression expr, bool paginate = false, bool isCountQuery = false, bool remoteGrouping = false)
        {
            var queryableType        = typeof(Queryable);
            var genericTypeArguments = new[] { typeof(T) };

            if (_loadOptions.HasFilter)
            {
                expr = Expression.Call(queryableType, "Where", genericTypeArguments, expr, Expression.Quote(new FilterExpressionCompiler <T>(_guardNulls).Compile(_loadOptions.Filter)));
            }

            if (!isCountQuery)
            {
                if (!remoteGrouping)
                {
                    if (_loadOptions.HasAnySort)
                    {
                        expr = new SortExpressionCompiler <T>(_guardNulls).Compile(expr, _loadOptions.GetFullSort());
                    }
                    if (_loadOptions.HasSelect)
                    {
                        expr = new SelectExpressionCompiler <T>(_guardNulls).Compile(expr, _loadOptions.Select);
                        genericTypeArguments = expr.Type.GetGenericArguments();
                    }
                }
                else
                {
                    expr = new RemoteGroupExpressionCompiler <T>(_loadOptions.Group, _loadOptions.TotalSummary, _loadOptions.GroupSummary).Compile(expr);
                }

                if (paginate)
                {
                    if (_loadOptions.Skip > 0)
                    {
                        expr = Expression.Call(queryableType, "Skip", genericTypeArguments, expr, Expression.Constant(_loadOptions.Skip));
                    }

                    if (_loadOptions.Take > 0)
                    {
                        expr = Expression.Call(queryableType, "Take", genericTypeArguments, expr, Expression.Constant(_loadOptions.Take));
                    }
                }
            }

            if (isCountQuery)
            {
                expr = Expression.Call(queryableType, "Count", genericTypeArguments, expr);
            }

            return(expr);
        }
Exemplo n.º 4
0
        Expression BuildCore(ParameterExpression param, bool paginate = false, bool isCountQuery = false, bool remoteGrouping = false)
        {
            var queryableType        = typeof(Queryable);
            var genericTypeArguments = new[] { typeof(T) };

            Expression body = param;

            if (_loadOptions.Filter != null)
            {
                body = Expression.Call(queryableType, "Where", genericTypeArguments, body, new FilterExpressionCompiler <T>(_guardNulls).Compile(_loadOptions.Filter));
            }

            if (!isCountQuery)
            {
                if (!remoteGrouping)
                {
                    if (_loadOptions.HasAnySort)
                    {
                        body = new SortExpressionCompiler <T>(_guardNulls).Compile(body, _loadOptions.GetFullSort());
                    }
                }
                else
                {
                    body = new RemoteGroupExpressionCompiler <T>(_loadOptions.Group, _loadOptions.TotalSummary, _loadOptions.GroupSummary).Compile(body);
                }

                if (paginate)
                {
                    if (_loadOptions.Skip > 0)
                    {
                        body = Expression.Call(queryableType, "Skip", genericTypeArguments, body, Expression.Constant(_loadOptions.Skip));
                    }

                    if (_loadOptions.Take > 0)
                    {
                        body = Expression.Call(queryableType, "Take", genericTypeArguments, body, Expression.Constant(_loadOptions.Take));
                    }
                }
            }

            if (isCountQuery)
            {
                body = Expression.Call(queryableType, "Count", genericTypeArguments, body);
            }

            return(body);
        }
Exemplo n.º 5
0
        public LambdaExpression Build(bool isCountQuery)
        {
            var queryableType        = typeof(Queryable);
            var genericTypeArguments = new[] { typeof(T) };
            var paramExpr            = Expression.Parameter(typeof(IQueryable <T>), "data");

            Expression body = paramExpr;

            if (Filter != null)
            {
                body = Expression.Call(queryableType, "Where", genericTypeArguments, body, new FilterExpressionCompiler <T>().Compile(Filter));
            }

            if (!isCountQuery)
            {
                if (Sort != null)
                {
                    body = new SortExpressionCompiler <T>().Compile(body, Sort);
                }

                if (Skip > 0)
                {
                    body = Expression.Call(queryableType, "Skip", genericTypeArguments, body, Expression.Constant(Skip));
                }

                if (Take > 0)
                {
                    body = Expression.Call(queryableType, "Take", genericTypeArguments, body, Expression.Constant(Take));
                }
            }

            if (isCountQuery)
            {
                body = Expression.Call(queryableType, "Count", genericTypeArguments, body);
            }

            return(Expression.Lambda(body, paramExpr));
        }