コード例 #1
0
ファイル: WindowFunction.cs プロジェクト: npenin/uss
 public WindowFunction(Identifier identifier, OrderByClause order, IEnumerable<IAliasedExpression> partition)
     : base(identifier)
 {
     OverOrder = order;
     if (partition != null)
         partitionBy = new List<IAliasedExpression>(partition);
 }
コード例 #2
0
ファイル: MethodCall.cs プロジェクト: pusp/o2platform
 public MethodCall(Identifier identifier, Expression[] parameters, Identifier anonIndentifier, Identifier indexIdentifier, Expression lambdaExpression)
 {
     this.identifier = identifier;
     this.parameters = parameters;
     this.anonIndentifier = anonIndentifier;
     this.indexIdentifier = indexIdentifier;
     this.lambdaExpression = lambdaExpression;
 }
コード例 #3
0
ファイル: ExpressionUpdater.cs プロジェクト: npenin/uss
        public virtual MethodCall Update(MethodCall m, Identifier target, Identifier methodName, Expression[] args)
        {
            if (target != m.AnonIdentifier || methodName != m.Identifier || args != m.Parameters)
            {
                return new MethodCall(methodName, (Expression[])args, m.AnonIdentifier, m.IndexIdentifier, m.LambdaExpression);

            }
            return m;
        }
コード例 #4
0
ファイル: JoinClause.cs プロジェクト: pusp/o2platform
 public JoinClause(string type, Identifier identifier, Expression inIdentifier, Expression on, Expression equals, Identifier into)
 {
     this.type = type;
     this.identifier = identifier;
     this.inIdentifier = inIdentifier;
     this.on = on;
     this.equals = equals;
     this.into = into;
 }
コード例 #5
0
ファイル: ColumnExpression.cs プロジェクト: npenin/uss
 public ColumnExpression(TableAlias alias, string columnName, string columnAlias)
     : base(alias)
 {
     if (columnName == AllColumns.Text)
         ColumnName = AllColumns;
     else
     {
         ColumnName = new Identifier(columnName);
         if (!string.IsNullOrEmpty(columnAlias))
             ColumnAlias = new Identifier(columnAlias);
     }
 }
コード例 #6
0
        public override NLinq.Expressions.SelectOrGroupClause Visit(NLinq.Expressions.SelectClause expression)
        {
            if (expression.Expression.ExpressionType == NLinq.Expressions.ExpressionTypes.Identifier)
            {
                identifierToFind = (Identifier)expression.Expression;
                return expression;
            }

            //visitingSelect = true;
            base.Visit(expression);
            //visitingSelect = false;
            return expression;
        }
コード例 #7
0
 public override NLinq.Expressions.Expression Visit(NLinq.Expressions.MemberExpression expression)
 {
     bool changeTempTarget = tempTarget == null;
     if (changeTempTarget)
     {
         tempTarget = target;
         tempIdentifier = Query.From.Identifier;
     }
     var result = base.Visit(expression);
     if (changeTempTarget)
     {
         tempTarget = null;
         tempIdentifier = null;
     }
     return result;
 }
コード例 #8
0
 public override Expression Visit(Identifier identifier)
 {
     Model.Reference reference;
     if (!tempTarget.References.TryGetValue(identifier.Text, out reference))
         throw new KeyNotFoundException("The reference " + identifier.Text + " could not be found on type " + tempTarget.Type);
     tempTarget = reference.Target;
     if (reference.Cardinality.IsMany)
     {
         tempIdentifier = new Identifier("e" + Query.QueryBody.Clauses.Count);
         Query.QueryBody.Clauses.Add(new FromClause(reference.Target.Type, tempIdentifier, new MemberExpression(new Identifier(reference.Name), ((SelectClause)Query.QueryBody.SelectOrGroup).Expression)));
         ((SelectClause)Query.QueryBody.SelectOrGroup).Expression = tempIdentifier;
     }
     else
     {
         ((SelectClause)Query.QueryBody.SelectOrGroup).Expression = new MemberExpression(new Identifier(reference.Name), ((SelectClause)Query.QueryBody.SelectOrGroup));
     }
     return base.Visit(identifier);
 }
コード例 #9
0
ファイル: MethodCall.cs プロジェクト: pusp/o2platform
 public MethodCall(Identifier identifier, Expression[] parameters)
 {
     this.identifier = identifier;
     this.parameters = parameters;
 }
コード例 #10
0
ファイル: DateOperations.cs プロジェクト: npenin/uss
 public DateAdd(Identifier identifier, Expression expression, Expression result)
     : base(DateAddIdentifier, identifier, expression, result)
 {
 }
コード例 #11
0
ファイル: WindowFunction.cs プロジェクト: npenin/uss
            public AggreggateWindowFunction(Identifier identifier, OrderByClause order, IEnumerable<IAliasedExpression> partition)
                : base(identifier, order, partition)
            {

            }
コード例 #12
0
ファイル: MethodCall.cs プロジェクト: npenin/uss
 public MethodCall(Expression target, Identifier methodName, Expression[] parameters)
 {
     this.Target = target;
     this.MethodName = methodName;
     Parameters = parameters;
 }
コード例 #13
0
ファイル: DateOperations.cs プロジェクト: npenin/uss
 public DatePart(Identifier part, Expression expressionToCast)
     : base(DatePartIdentifier, new Expression[] { part, expressionToCast })
 {
 }
コード例 #14
0
 public PropertyReferenceExpression(AliasedExpression target, Identifier propertyName)
     : base(target)
 {
     this.PropertyName = propertyName;
 }
コード例 #15
0
ファイル: Function.cs プロジェクト: npenin/uss
 public Function(TableAlias alias, Identifier identifier, params Expression[] parameters)
     : base(alias)
 {
     this.MethodName = identifier;
     this.Parameters = parameters;
 }
コード例 #16
0
ファイル: ColumnExpression.cs プロジェクト: npenin/uss
 public ColumnExpression(TableAlias alias, Identifier columnName)
     : this(alias, columnName, null)
 {
 }
コード例 #17
0
ファイル: ColumnExpression.cs プロジェクト: npenin/uss
 public ColumnExpression(TableAlias alias, Identifier columnName, DbType type)
     : base(alias)
 {
     ColumnName = columnName;
     Type = type;
 }
コード例 #18
0
ファイル: QueryContinuation.cs プロジェクト: pusp/o2platform
 public QueryContinuation(Identifier identifier, QueryBody queryBody)
 {
     this.identifier = identifier;
     this.queryBody = queryBody;
 }
コード例 #19
0
ファイル: ComplexColumnExpression.cs プロジェクト: npenin/uss
 public ComplexColumnExpression(TableAlias alias, Expression innerExpression, Identifier columnAlias)
     : base(alias, null, columnAlias)
 {
     Expression = innerExpression;
 }
コード例 #20
0
 public override QueryBodyClause Visit(FromClause expression)
 {
     if (expression.Type == target.Type && targetIdentifier == null)
         targetIdentifier = expression.Identifier;
     return base.Visit(expression);
 }
コード例 #21
0
ファイル: ExpressionUpdater.cs プロジェクト: npenin/uss
 public virtual AnonymousParameter Update(AnonymousParameter original, Identifier identifier, Expression expression)
 {
     if (original.Expression != expression || original.Identifier != identifier)
         return new AnonymousParameter(identifier, expression);
     return original;
 }
コード例 #22
0
ファイル: LetClause.cs プロジェクト: pusp/o2platform
 public LetClause(Identifier left, Expression right)
 {
     this.left = left;
     this.right = right;
 }
コード例 #23
0
ファイル: Aggregate.cs プロジェクト: npenin/uss
 public Aggregate(TableAlias alias, Identifier methodName, params Expression[] expression)
     : base(alias, methodName, expression)
 {
 }
コード例 #24
0
ファイル: Aggregate.cs プロジェクト: npenin/uss
 public Aggregate(Identifier methodName, params Expression[] expression)
     : base(methodName, expression)
 {
 }
コード例 #25
0
ファイル: ColumnExpression.cs プロジェクト: npenin/uss
 public ColumnExpression(TableAlias alias, Identifier columnName, Identifier columnAlias)
     : base(alias)
 {
     ColumnName = columnName;
     ColumnAlias = columnAlias;
 }
コード例 #26
0
ファイル: FromClause.cs プロジェクト: pusp/o2platform
 public FromClause(string type, Identifier identifier, Expression expression)
 {
     this.type = type;
     this.identifier = identifier;
     this.expression = expression;
 }
コード例 #27
0
ファイル: QueryTranslator.cs プロジェクト: npenin/uss
        public NLinq.Expressions.Expression Visit(MethodCallExpression call)
        {
            if (call.Method.IsStatic && (call.Method.DeclaringType == typeof(Enumerable) || call.Method.DeclaringType == typeof(Queryable)) || call.Method.DeclaringType == typeof(ContextExtensions))
            {
                NLinq.Expressions.Expression subExpression = Visit(call.Arguments[0]);
                switch (call.Method.Name)
                {
                    case "Skip":
                    case "Take":
                        if (tree == null)
                        {
                            if (subExpression == null)
                                subExpression = new QueryExpression(from, new QueryBody(clauses, new SelectClause(identifiers["#First"]), null));
                            tree = new NLINQ.MemberExpression(new MethodCall(call.Method.Name, Visit(call.Arguments[1])), subExpression);
                        }
                        else
                            tree = new NLINQ.MemberExpression(new MethodCall(call.Method.Name, Visit(call.Arguments[1])), tree);
                        return tree;
                    case "Cast":
                        return subExpression;
                    case "FirstOrDefault":
                    case "LastOrDefault":
                    case "Last":
                    case "First":
                        string methodName = call.Method.Name;
                        if (call.Method.Name.EndsWith("OrDefault"))
                            methodName = methodName.Substring(0, call.Method.Name.Length - 9);
                        if (tree == null)
                        {
                            if (subExpression == null)
                                subExpression = new QueryExpression(from, new QueryBody(clauses, new SelectClause(identifiers["#First"]), null));
                            tree = new NLINQ.MemberExpression(new MethodCall(new Identifier(methodName)), subExpression);
                        }
                        else
                            tree = new NLINQ.MemberExpression(new MethodCall(new Identifier(methodName)), tree);
                        break;
                    case "Select":
                        SelectOrGroupClause select = new SelectClause(Visit(call.Arguments[1]));
                        tree = new QueryExpression(from, new QueryBody(clauses, select, null));
                        identifiers["#First"].Text = "e" + identifiers["#First"].GetHashCode();
                        identifiers.Clear();
                        identifiers["#First"] = new Identifier("e0");
                        clauses = new ClauseList();
                        from = new FromClause(null, identifiers["#First"], tree);
                        return tree;
                    case "SelectMany":
                        //Select the result of the join (a load reference)
                        FromClause from2 = null;
                        Identifier newElement = null;
                        select = null;

                        if (call.Arguments.Count == 2)
                            newElement = new Identifier("e1");
                        if (call.Arguments.Count == 3)
                            newElement = new Identifier(((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[2]).Operand).Parameters[1].Name);

                        from2 = new FromClause(call.Method.GetGenericArguments()[1].FullName, newElement, Visit(call.Arguments[1]));

                        if (call.Arguments.Count == 2)
                        {
                            //System.Linq.Expressions.LambdaExpression lambda = ((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[1]).Operand);
                            identifiers["#First"].Text = "e" + identifiers["#First"].GetHashCode();

                            //newElement = new Identifier("e0");
                            identifiers.Clear();
                            newElement.Text = "e0";
                            identifiers.Add("#First", newElement);
                            identifiers.Add(newElement.Text, newElement);
                            select = new SelectClause(newElement);
                        }

                        //Select a property of the select many
                        if (call.Arguments.Count == 3)
                        {
                            //newElement = new Identifier(((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[2]).Operand).Parameters[1].Name);
                            identifiers.Add(newElement.Text, newElement);
                            Identifier src = new Identifier(((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[2]).Operand).Parameters[0].Name);
                            if (!identifiers.ContainsKey(src.Text))
                                identifiers.Add(src.Text, identifiers["#First"]);
                            select = new SelectClause(Visit(((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[2]).Operand).Body));
                            if (((SelectClause)select).Expression == null)
                                select = null;
                        }
                        if (call.Arguments.Count > 3)
                            throw new NotSupportedException();
                        //from2 = new FromClause(call.Method.GetGenericArguments()[1].FullName, newElement, Visit(((System.Linq.Expressions.LambdaExpression)((System.Linq.Expressions.UnaryExpression)call.Arguments[1]).Operand).Body));
                        clauses.Add(from2);
                        tree = new QueryExpression(from, new QueryBody(clauses, select, null));
                        break;
                    case "Avg":
                    case "Sum":
                        if (subExpression == null)
                            subExpression = new QueryExpression(from, new QueryBody(clauses, new SelectClause(identifiers["#First"]), null));
                        tree = new NLINQ.MemberExpression(new MethodCall(new Identifier(call.Method.Name)), subExpression);
                        return tree;
                    case "Count":
                    case "Any":
                        if (call.Arguments.Count > 1)
                        {
                            if (subExpression != null)
                            {
                                var param = ((System.Linq.Expressions.LambdaExpression)call.Arguments[1]).Parameters[0];
                                var paramIdent = new Identifier(param.Name);
                                identifiers.Add(param.Name, paramIdent);
                                subExpression = new QueryExpression(new FromClause(param.Type.FullName, paramIdent, subExpression), new QueryBody(new ClauseList(new List<QueryBodyClause>() { new WhereClause(Visit(call.Arguments[1])) }), new SelectClause(paramIdent), null));
                            }
                            else
                                clauses.Add(new WhereClause(Visit(call.Arguments[1])));
                        }
                        if (subExpression == null)
                            subExpression = new QueryExpression(from, new QueryBody(clauses, new SelectClause(identifiers["#First"]), null));
                        tree = new NLINQ.MemberExpression(new MethodCall(new Identifier(call.Method.Name)), subExpression);
                        return tree;
                    case "Intersect":
                        break;
                    case "Where":
                        clauses.Add(new WhereClause(Visit(call.Arguments[1])));
                        tree = null;
                        if (from == null)
                            from = new FromClause(null, identifiers["#First"], subExpression);
                        break;
                    case "OrderBy":
                        NLINQ.Expression m = Visit(call.Arguments[1]);
                        clauses.Add(new OrderByClause(new OrderByCriteria(m, true)));
                        break;
                    case "ThenBy":
                        break;
                    case "Infer":
                        var inferQuery = new QueryTranslator(from.Type);
                        var result = inferQuery.Visit(call.Arguments[1]);
                        var first = inferQuery.identifiers["#First"];
                        NLINQ.MemberExpression me = (NLINQ.MemberExpression)result;
                        while (me.Previous != first)
                            me = (NLINQ.MemberExpression)me.Previous;
                        me.Previous = null;
                        if (inferQuery.tree != null)
                            result = inferQuery.tree;
                        InferredRelationShips.Add(result.ToString());
                        tree = subExpression;
                        return subExpression;
                }
            }
            if (call.Method.DeclaringType == typeof(string) || call.Method.DeclaringType == typeof(DateTime))
            {
                NLinq.Expressions.Expression source = Visit(call.Object);
                List<NLinq.Expressions.Expression> parameters = new List<NLinq.Expressions.Expression>();
                foreach (var arg in call.Arguments)
                {
                    var param = Visit(arg);
                    if (param != null)
                        parameters.Add(param);
                }
                return new NLinq.Expressions.MemberExpression(
                    new NLinq.Expressions.MethodCall(new NLinq.Expressions.Identifier(call.Method.Name), parameters.ToArray()),
                    source);
            }
            return null;
        }
コード例 #28
0
ファイル: QueryTranslator.cs プロジェクト: npenin/uss
        public NLinq.Expressions.Expression Visit(System.Linq.Expressions.LambdaExpression expression)
        {
            List<string> identifiers = new List<string>();
            foreach (ParameterExpression param in expression.Parameters)
            {
                if (!string.IsNullOrEmpty(param.Name))
                    identifiers.Add(param.Name);

                Identifier identifier;

                if (this.identifiers["#First"].Text == "e0")
                {
                    this.identifiers["#First"].Text = param.Name;
                    this.identifiers.Add(param.Name, this.identifiers["#First"]);
                    identifiers.Remove(param.Name);
                }
                else if (!this.identifiers.TryGetValue(param.Name, out identifier))
                {
                    identifier = new Identifier(param.Name);
                    if (string.IsNullOrEmpty(param.Name))
                        identifier.Text = "e" + param.GetHashCode();
                    this.identifiers.Add(param.Name, identifier);
                }
            }
            if (from == null)
                Visit(expression.Parameters[0]);
            NLinq.Expressions.Expression result = Visit(expression.Body);
            return result;
        }
コード例 #29
0
 public PropertyReferenceExpression(TableAlias alias, AliasedExpression target, Identifier propertyName)
     : base(alias, target)
 {
     this.PropertyName = propertyName;
 }
コード例 #30
0
ファイル: Function.cs プロジェクト: npenin/uss
 public Function(Identifier identifier, params Expression[] parameters)
     : this(null, identifier, parameters)
 {
 }