protected string GetSourceVarName(MemberExpression expression) { string sourceVarName = null; if (expression.Expression is QuerySourceReferenceExpression) { var querySource = expression.Expression as QuerySourceReferenceExpression; Expression mappedExpression; if (QueryBuilder.TryGetQuerySourceMapping(querySource.ReferencedQuerySource, out mappedExpression) && mappedExpression is SelectVariableNameExpression) { sourceVarName = (mappedExpression as SelectVariableNameExpression).Name; } else { sourceVarName = querySource.ReferencedQuerySource.ItemName; QueryBuilder.AddQuerySourceMapping( querySource.ReferencedQuerySource, new SelectVariableNameExpression(querySource.ReferencedQuerySource.ItemName, VariableBindingType.Resource, querySource.ReferencedQuerySource.ItemType)); } } else if (expression.Expression is MemberExpression) { var memberExpression = VisitExpression(expression.Expression); if (memberExpression is SelectVariableNameExpression) { sourceVarName = (memberExpression as SelectVariableNameExpression).Name; } } return(sourceVarName); }
private string GetExpressionVariable(Expression expression) { if (expression is QuerySourceReferenceExpression) { var querySource = expression as QuerySourceReferenceExpression; Expression mappedExpression; _queryBuilder.TryGetQuerySourceMapping(querySource.ReferencedQuerySource, out mappedExpression); if (mappedExpression is SelectVariableNameExpression) return (mappedExpression as SelectVariableNameExpression).Name; } var selector = SparqlGeneratorWhereExpressionTreeVisitor.GetSparqlExpression(expression, _queryBuilder); if (selector is SelectVariableNameExpression) return (selector as SelectVariableNameExpression).Name; return null; }
private string GetExpressionVariable(Expression expression) { if (expression is QuerySourceReferenceExpression) { var querySource = expression as QuerySourceReferenceExpression; Expression mappedExpression; _queryBuilder.TryGetQuerySourceMapping(querySource.ReferencedQuerySource, out mappedExpression); if (mappedExpression is SelectVariableNameExpression) { return((mappedExpression as SelectVariableNameExpression).Name); } } var selector = SparqlGeneratorWhereExpressionTreeVisitor.GetSparqlExpression(expression, _queryBuilder, _context.FilterOptimizationEnabled); if (selector is SelectVariableNameExpression) { return((selector as SelectVariableNameExpression).Name); } return(null); }
protected override Expression VisitMemberExpression(MemberExpression expression) { string sourceVarName = null; if (expression.Expression is QuerySourceReferenceExpression) { var source = expression.Expression as QuerySourceReferenceExpression; Expression mappedSourceExpression; sourceVarName = source.ReferencedQuerySource.ItemName; if (_queryBuilder.TryGetQuerySourceMapping(source.ReferencedQuerySource, out mappedSourceExpression) && mappedSourceExpression is SelectVariableNameExpression) { sourceVarName = (mappedSourceExpression as SelectVariableNameExpression).Name; } } else if (expression.Expression is MemberExpression) { var memberExpression = VisitExpression(expression.Expression); if (memberExpression is SelectVariableNameExpression) { sourceVarName = (memberExpression as SelectVariableNameExpression).Name; } } else if (expression.Expression is UnaryExpression) { var unary = expression.Expression as UnaryExpression; if (unary.NodeType == ExpressionType.TypeAs && unary.Operand is QuerySourceReferenceExpression) { var targetType = unary.Type; var source = unary.Operand as QuerySourceReferenceExpression; if (source != null) { var itemType = source.ReferencedQuerySource.ItemType; if (targetType.IsAssignableFrom(itemType)) { expression = Expression.MakeMemberAccess(unary.Operand, expression.Member); return(VisitExpression(expression)); } } } var updatedExpression = VisitExpression(expression.Expression) as UnaryExpression; if (updatedExpression != null && updatedExpression.Operand is SelectVariableNameExpression) { #if WINDOWS_PHONE || PORTABLE return(Expression.MakeMemberAccess(updatedExpression, expression.Member)); #else return(expression.Update(updatedExpression)); #endif } } if (!String.IsNullOrEmpty(sourceVarName)) { #if PORTABLE if (expression.Member is PropertyInfo) #else if (expression.Member.MemberType == MemberTypes.Property) #endif { var propertyInfo = expression.Member as PropertyInfo; var propertyHint = _queryBuilder.Context.GetPropertyHint(propertyInfo); if (propertyHint != null) { switch (propertyHint.MappingType) { case PropertyMappingType.Arc: { var memberVarName = _queryBuilder.GetVariableForObject( GraphNode.Variable, sourceVarName, GraphNode.Iri, propertyHint.SchemaTypeUri); if (memberVarName == null) { memberVarName = _queryBuilder.NextVariable(); _queryBuilder.AddTripleConstraint( GraphNode.Variable, sourceVarName, GraphNode.Iri, propertyHint.SchemaTypeUri, GraphNode.Variable, memberVarName); } return(new SelectVariableNameExpression(memberVarName, VariableBindingType.Resource, propertyInfo.PropertyType)); } case PropertyMappingType.InverseArc: { var memberVarName = _queryBuilder.GetVariableForSubject( GraphNode.Iri, propertyHint.SchemaTypeUri, GraphNode.Variable, sourceVarName); if (memberVarName == null) { memberVarName = _queryBuilder.NextVariable(); _queryBuilder.AddTripleConstraint( GraphNode.Variable, memberVarName, GraphNode.Iri, propertyHint.SchemaTypeUri, GraphNode.Variable, sourceVarName); } return(new SelectVariableNameExpression(memberVarName, VariableBindingType.Resource, propertyInfo.PropertyType)); } case PropertyMappingType.Property: { var propertyValueVarName = _queryBuilder.GetVariableForObject(GraphNode.Variable, sourceVarName, GraphNode.Iri, propertyHint. SchemaTypeUri); if (propertyValueVarName == null) { propertyValueVarName = _queryBuilder.NextVariable(); _queryBuilder.AddTripleConstraint( GraphNode.Variable, sourceVarName, GraphNode.Iri, propertyHint.SchemaTypeUri, GraphNode.Variable, propertyValueVarName); } return(new SelectVariableNameExpression(propertyValueVarName, VariableBindingType.Literal, propertyInfo.PropertyType)); } case PropertyMappingType.Address: { return(new SelectVariableNameExpression(sourceVarName, VariableBindingType.Resource, propertyInfo.PropertyType)); } case PropertyMappingType.Id: { var prefix = EntityMappingStore.GetIdentifierPrefix(propertyInfo.DeclaringType); return(new SelectIdentifierVariableNameExpression(sourceVarName, prefix)); //return new SelectVariableNameExpression(sourceVarName, VariableBindingType.Resource, propertyInfo.PropertyType); } } } } } return(base.VisitMemberExpression(expression)); }