Ejemplo n.º 1
0
            public override ISqlExpression GetSubQuery(IBuildContext context)
            {
                if (_subQuerySql == null)
                {
                    var args      = _methodCall.Method.GetGenericArguments();
                    var param     = Expression.Parameter(args[0], "param");
                    var expr      = _methodCall.Arguments[1];
                    var condition = Expression.Lambda(Expression.Equal(param, expr), param);

                    IBuildContext ctx = new ExpressionContext(Parent, Sequence, condition);

                    ctx = Builder.GetContext(ctx, expr) ?? ctx;

                    Builder.ReplaceParent(ctx, this);

                    SqlQuery.Condition cond;

                    if (Sequence.SqlQuery != SqlQuery &&
                        (ctx.IsExpression(expr, 0, RequestFor.Field).Result ||
                         ctx.IsExpression(expr, 0, RequestFor.Expression).Result))
                    {
                        Sequence.ConvertToIndex(null, 0, ConvertFlags.All);
                        var ex = Builder.ConvertToSql(ctx, _methodCall.Arguments[1]);
                        cond = new SqlQuery.Condition(false, new SqlQuery.Predicate.InSubQuery(ex, false, SqlQuery));
                    }
                    else
                    {
                        var sequence = Builder.BuildWhere(Parent, Sequence, condition, true);
                        cond = new SqlQuery.Condition(false, new SqlQuery.Predicate.FuncLike(SqlFunction.CreateExists(sequence.SqlQuery)));
                    }

                    _subQuerySql = new SqlQuery.SearchCondition(cond);
                }

                return(_subQuerySql);
            }