Exemple #1
0
        public override Expression <Func <Job, bool> > Build(JobsQueryParameter parameter)
        {
            if (parameter.Category > 0)
            {
                QueryExpression = QueryExpression.And(x => x.CategoryId == parameter.Category);
            }

            if (parameter.HireType > 0)
            {
                QueryExpression = QueryExpression.And(x => x.HireTypeId == parameter.HireType);
            }

            if (parameter.OnlyRemote)
            {
                QueryExpression = QueryExpression.And(x => x.IsRemote);
            }

            if (!string.IsNullOrWhiteSpace(parameter.Title))
            {
                QueryExpression = QueryExpression.And(x => x.Title.Contains(parameter.Title));
            }

            if (!string.IsNullOrWhiteSpace(parameter.Description))
            {
                QueryExpression = QueryExpression.And(x => x.Description.Contains(parameter.Description));
            }

            if (!string.IsNullOrWhiteSpace(parameter.HowToApply))
            {
                QueryExpression = QueryExpression.And(x => x.HowToApply.Contains(parameter.HowToApply));
            }

            return(QueryExpression);
        }
Exemple #2
0
        private LinqQueryExpression <TEntity> HasFlagCall <TEntity>(MethodCallExpression methodCallExpression,
                                                                    ExpressionConversionVisitor <TEntity> expressionConverter)
            where TEntity : class
        {
            var expression = expressionConverter.Visit(methodCallExpression.Arguments[1]) as LinqQueryExpression <TEntity>;
            var value      = expressionConverter.Visit(methodCallExpression.Arguments[2]) as LinqQueryExpression <TEntity>;

            return(new LinqQueryExpression <TEntity>(
                       QueryExpression.AreEqual(
                           QueryExpression.And(expression.QueryExpression, value.QueryExpression),
                           value.QueryExpression
                           ),
                       (expression.JoinBuilders ?? JoinBuilder <TEntity> .Empty).Concat(
                           value.JoinBuilders ?? JoinBuilder <TEntity> .Empty
                           )));
        }
        protected override Expression VisitBinary(BinaryExpression node)
        {
            var left = Visit(node.Left) as LinqQueryExpression <TEntity>;

            if (left == null)
            {
                throw new InvalidOperationException("Couldn't convert expression to SQL query expression.");
            }

            var right = Visit(node.Right) as LinqQueryExpression <TEntity>;

            if (right == null)
            {
                throw new InvalidOperationException("Couldn't convert expression to SQL query expression.");
            }

            var leftExpression  = left.QueryExpression;
            var rightExpression = right.QueryExpression;

            switch (node.NodeType)
            {
            case ExpressionType.AddChecked:
            case ExpressionType.Add:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Add(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.SubtractChecked:
            case ExpressionType.Subtract:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Subtract(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.MultiplyChecked:
            case ExpressionType.Multiply:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Multiply(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Divide:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Divide(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.And:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.And(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.ExclusiveOr:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.ExclusiveOr(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Or:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Or(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.AndAlso:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AndAlso(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.OrElse:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.OrElse(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Equal:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AreEqual(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.NotEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AreNotEqual(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.GreaterThan:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.GreaterThan(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.GreaterThanOrEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.GreaterThanOrEqualTo(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.LessThan:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.LessThan(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.LessThanOrEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.LessThanOrEqualTo(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            default:
                throw new Exception($"Unsupported binary node type '{node.NodeType}'.");
            }
        }