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); }
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); }
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); }