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); }
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); }
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); }
public override IBuildContext?GetContext(Expression?expression, int level, BuildInfo buildInfo) { expression = SequenceHelper.CorrectExpression(expression, this, Sequence); return(Sequence.GetContext(expression, level, buildInfo)); }
public override IsExpressionResult IsExpression(Expression?expression, int level, RequestFor requestFlag) { expression = SequenceHelper.CorrectExpression(expression, this, Sequence); return(Sequence.IsExpression(expression, level, requestFlag)); }
public override SqlInfo[] ConvertToIndex(Expression?expression, int level, ConvertFlags flags) { expression = SequenceHelper.CorrectExpression(expression, this, Sequence); return(Sequence.ConvertToIndex(expression, level, flags)); }