Пример #1
0
        public override SqlInfo[] ConvertToSql(Expression?expression, int level, ConvertFlags flags)
        {
            expression = SequenceHelper.CorrectExpression(expression, this, Context);

            var indexes = SubQuery
                          .ConvertToIndex(expression, level, flags)
                          .ToArray();

            var result = indexes
                         .Select(idx => new SqlInfo(idx.MemberChain, idx.Index < 0 ? idx.Sql : SubQuery.SelectQuery.Select.Columns[idx.Index], idx.Index))
                         .ToArray();

            return(result);
        }
Пример #2
0
        public override SqlInfo[] ConvertToSql(Expression?expression, int level, ConvertFlags flags)
        {
            expression = SequenceHelper.CorrectExpression(expression, this, SubQuery);

            return(SubQuery
                   .ConvertToIndex(expression, level, flags)
                   .Select(info =>
            {
                var expr = (info.Sql is SqlColumn column) ? column.Expression : info.Sql;
                var field = RegisterSourceField(expr, expr, info.Index, info.MemberChain.LastOrDefault());

                return new SqlInfo(info.MemberChain, field);
            })
                   .ToArray());
        }
            public override SqlInfo[] ConvertToSql(Expression?expression, int level, ConvertFlags flags)
            {
                var queryContext = GetQueryContext();

                if (queryContext == null)
                {
                    return(base.ConvertToSql(expression, level, flags));
                }

                var baseInfos = base.ConvertToSql(null, 0, ConvertFlags.All);

                if (flags != ConvertFlags.All && _cte.Fields !.Length == 0 && queryContext.SelectQuery.Select.Columns.Count > 0)
                {
                    // it means that queryContext context already has columns and we need all of them. For example for Distinct.
                    ConvertToSql(null, 0, ConvertFlags.All);
                }

                expression = SequenceHelper.CorrectExpression(expression, this, queryContext);

                var infos = queryContext.ConvertToIndex(expression, level, flags);

                var result = infos
                             .Select(info =>
                {
                    var baseInfo = baseInfos.FirstOrDefault(bi => bi.CompareMembers(info));
                    var alias    = flags == ConvertFlags.Field ? GenerateAlias(expression) : null;
                    if (alias == null)
                    {
                        alias = baseInfo?.MemberChain.LastOrDefault()?.Name ??
                                info.MemberChain.LastOrDefault()?.Name;
                    }
                    var field = RegisterCteField(baseInfo?.Sql, info.Sql, info.Index, alias);
                    return(new SqlInfo(info.MemberChain, field));
                })
                             .ToArray();

                return(result);
            }
Пример #4
0
            public override Expression BuildExpression(Expression?expression, int level, bool enforceServerSide)
            {
                expression = SequenceHelper.CorrectExpression(expression, this, Sequence);

                var expr = Sequence.BuildExpression(expression, level, enforceServerSide);

                if (!Disabled && expression == null)
                {
                    var q =
                        from col in SelectQuery.Select.Columns
                        where !col.CanBeNull
                        select SelectQuery.Select.Columns.IndexOf(col);

                    var idx = q.DefaultIfEmpty(-1).First();

                    if (idx == -1)
                    {
                        idx = SelectQuery.Select.Add(new SqlValue((int?)1));
                        SelectQuery.Select.Columns[idx].RawAlias = "is_empty";
                    }

                    var n = ConvertToParentIndex(idx, this);

                    Expression e = Expression.Call(
                        ExpressionBuilder.DataReaderParam,
                        ReflectionHelper.DataReader.IsDBNull,
                        ExpressionInstances.Int32Array(n));

                    var defaultValue = DefaultValue ?? new DefaultValueExpression(Builder.MappingSchema, expr.Type);

                    if (expr.NodeType == ExpressionType.Parameter)
                    {
                        var par  = (ParameterExpression)expr;
                        var pidx = Builder.BlockVariables.IndexOf(par);

                        if (pidx >= 0)
                        {
                            var ex = Builder.BlockExpressions[pidx];

                            if (ex.NodeType == ExpressionType.Assign)
                            {
                                var bex = (BinaryExpression)ex;

                                if (bex.Left == expr)
                                {
                                    if (bex.Right.NodeType != ExpressionType.Conditional)
                                    {
                                        Builder.BlockExpressions[pidx] =
                                            Expression.Assign(
                                                bex.Left,
                                                Expression.Condition(e, defaultValue, bex.Right));
                                    }
                                }
                            }
                        }
                    }

                    expr = Expression.Condition(e, defaultValue, expr);
                }

                return(expr);
            }
Пример #5
0
 public override IBuildContext?GetContext(Expression?expression, int level, BuildInfo buildInfo)
 {
     expression = SequenceHelper.CorrectExpression(expression, this, Sequence);
     return(Sequence.GetContext(expression, level, buildInfo));
 }
Пример #6
0
 public override IsExpressionResult IsExpression(Expression?expression, int level, RequestFor requestFlag)
 {
     expression = SequenceHelper.CorrectExpression(expression, this, Sequence);
     return(Sequence.IsExpression(expression, level, requestFlag));
 }
Пример #7
0
 public override SqlInfo[] ConvertToIndex(Expression?expression, int level, ConvertFlags flags)
 {
     expression = SequenceHelper.CorrectExpression(expression, this, Sequence);
     return(Sequence.ConvertToIndex(expression, level, flags));
 }