Example #1
0
        private VariableInitializer TransformMapDefinitionFromLinqQuerySyntax(string query, out string entityName)
        {
            entityName = null;
            var variableDeclaration = QueryParsingUtils.GetVariableDeclarationForLinqQuery(query, RequiresSelectNewAnonymousType);
            var queryExpression     = ((QueryExpression)variableDeclaration.Initializer);
            var fromClause          = GetFromClause(queryExpression);
            var expression          = fromClause.Expression;

            HandleCollectionName(expression, fromClause, queryExpression, ref entityName);
            var projection =
                QueryParsingUtils.GetAnonymousCreateExpression(
                    queryExpression.Clauses.OfType <QuerySelectClause>().First().Expression);

            var anonymousTypeCreateExpression = projection as AnonymousTypeCreateExpression;

            if (anonymousTypeCreateExpression == null)
            {
                return(variableDeclaration);
            }

            var objectInitializer = anonymousTypeCreateExpression.Initializers;

            var identifierExpression = new IdentifierExpression(fromClause.Identifier);

            if (objectInitializer.OfType <NamedExpression>().Any(x => x.Name == Constants.DocumentIdFieldName))
            {
                return(variableDeclaration);
            }

            variableDeclaration.AcceptVisitor(new AddDocumentIdToQueries(), null);

            variableDeclaration.AcceptVisitor(this.transformFromClauses, null);

            return(variableDeclaration);
        }
Example #2
0
            private bool AddDocumentIdFieldToLambdaIfCreatingNewObject(LambdaExpression lambdaExpression)
            {
                var objectCreateExpression = QueryParsingUtils.GetAnonymousCreateExpression(lambdaExpression.ExpressionBody) as ObjectCreateExpression;

                if (objectCreateExpression == null || objectCreateExpression.IsAnonymousType == false)
                {
                    return(false);
                }

                var objectInitializer = objectCreateExpression.ObjectInitializer;

                var identifierExpression = new IdentifierExpression(lambdaExpression.Parameters[0].ParameterName);

                if (objectInitializer.CreateExpressions.OfType <NamedArgumentExpression>().Any(x => x.Name == Constants.DocumentIdFieldName))
                {
                    return(false);
                }


                objectCreateExpression.ObjectInitializer = new CollectionInitializerExpression(objectInitializer.CreateExpressions.ToList())
                {
                    CreateExpressions =
                    {
                        new NamedArgumentExpression
                        {
                            Name       = Constants.DocumentIdFieldName,
                            Expression = new MemberReferenceExpression(identifierExpression, Constants.DocumentIdFieldName)
                        }
                    }
                };

                return(true);
            }
Example #3
0
            private bool AddDocumentIdFieldToLambdaIfCreatingNewObject(LambdaExpression lambdaExpression)
            {
                var objectCreateExpression = QueryParsingUtils.GetAnonymousCreateExpression(lambdaExpression.Body) as AnonymousTypeCreateExpression;

                if (objectCreateExpression == null)
                {
                    return(false);
                }

                var initializers = objectCreateExpression.Initializers;

                var identifierExpression = new IdentifierExpression(lambdaExpression.Parameters.First().Name);

                if (initializers.OfType <NamedExpression>().Any(x => x.Name == Constants.DocumentIdFieldName))
                {
                    return(false);
                }

                objectCreateExpression.Initializers.Add(new NamedExpression
                {
                    Name       = Constants.DocumentIdFieldName,
                    Expression = new MemberReferenceExpression(identifierExpression, Constants.DocumentIdFieldName)
                });

                return(true);
            }
            private bool AddDocumentIdFieldToLambdaIfCreatingNewObject(LambdaExpression lambdaExpression)
            {
                var objectCreateExpression = QueryParsingUtils.GetAnonymousCreateExpression(lambdaExpression.Body) as AnonymousTypeCreateExpression;

                if (objectCreateExpression == null)
                {
                    return(false);
                }

                var initializers = objectCreateExpression.Initializers;

                if (initializers.OfType <NamedExpression>().Any(x => x.Name == Constants.DocumentIdFieldName))
                {
                    return(false);
                }

                var parameter  = lambdaExpression.Parameters.First();
                var identifier = parameter.Name;

                // Support getting the __document_id from IGrouping parameter
                var castExpression = parameter.Parent.Parent.Parent as CastExpression;

                if (castExpression != null)
                {
                    var simpleType = castExpression.Type as SimpleType;
                    if (simpleType != null && simpleType.Identifier == "Func<IGrouping<dynamic,dynamic>, dynamic>")
                    {
                        identifier += ".Key";
                    }
                }

                var identifierExpression = new IdentifierExpression(identifier);

                objectCreateExpression.Initializers.Add(new NamedExpression
                {
                    Name       = Constants.DocumentIdFieldName,
                    Expression = new MemberReferenceExpression(identifierExpression, Constants.DocumentIdFieldName)
                });

                return(true);
            }
        private VariableInitializer TransformMapDefinitionFromLinqQuerySyntax(string query, out string entityName)
        {
            entityName = null;
            var variableDeclaration = QueryParsingUtils.GetVariableDeclarationForLinqQuery(query, RequiresSelectNewAnonymousType);
            var queryExpression     = ((QueryExpression)variableDeclaration.Initializer);
            var fromClause          = queryExpression.Clauses.OfType <QueryFromClause>().First();
            var expression          = fromClause.Expression;

            if (expression is MemberReferenceExpression)             // collection
            {
                var mre = (MemberReferenceExpression)expression;
                entityName            = mre.MemberName;
                fromClause.Expression = mre.Target;
                //doc["@metadata"]["Raven-Entity-Name"]
                var metadata = new IndexerExpression(
                    new IndexerExpression(new IdentifierExpression(fromClause.Identifier), new List <Expression> {
                    new StringLiteralExpression("@metadata")
                }),
                    new List <Expression> {
                    new StringLiteralExpression(Constants.RavenEntityName)
                }
                    );

                // string.Equals(doc["@metadata"]["Raven-Entity-Name"], "Blogs", StringComparison.OrdinalIgnoreCase)
                var binaryOperatorExpression =
                    new InvocationExpression(
                        new MemberReferenceExpression(new TypeReferenceExpression(new PrimitiveType("string")), "Equals"),
                        new List <Expression>
                {
                    metadata,
                    new StringLiteralExpression(mre.MemberName),
                    new MemberReferenceExpression(new TypeReferenceExpression(new SimpleType(typeof(StringComparison).FullName)), "InvariantCultureIgnoreCase")
                });

                queryExpression.Clauses.InsertAfter(fromClause,
                                                    new QueryWhereClause
                {
                    Condition = binaryOperatorExpression
                });
            }
            var projection =
                QueryParsingUtils.GetAnonymousCreateExpression(
                    queryExpression.Clauses.OfType <QuerySelectClause>().First().Expression);

            var anonymousTypeCreateExpression = projection as AnonymousTypeCreateExpression;

            if (anonymousTypeCreateExpression == null)
            {
                return(variableDeclaration);
            }

            var objectInitializer = anonymousTypeCreateExpression.Initializers;

            var identifierExpression = new IdentifierExpression(fromClause.Identifier);

            if (objectInitializer.OfType <NamedExpression>().Any(x => x.Name == Constants.DocumentIdFieldName))
            {
                return(variableDeclaration);
            }

            objectInitializer.Add(
                new NamedExpression
            {
                Name       = Constants.DocumentIdFieldName,
                Expression = new MemberReferenceExpression(identifierExpression, Constants.DocumentIdFieldName)
            });
            return(variableDeclaration);
        }