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;
 }
Exemple #3
0
        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));
        }