コード例 #1
0
            public override QueryExpression Visit(QueryRootExpression expression)
            {
                var entitySetPropertyInfo = expression.GetType().GetProperties(false, false).Where(p => p.Name == "UnderlyingEntitySet").Single();
                var entitySet             = (EntitySet)entitySetPropertyInfo.GetValue(expression, null);

                return(CommonQueryBuilder.Root(entitySet));
            }
コード例 #2
0
            protected override Expression VisitExtension(Expression node)
            {
                if (node is QueryRootExpression expression)
                {
                    QueryRootExpression = expression;
                }

                return(base.VisitExtension(node));
            }
コード例 #3
0
ファイル: QueryRepository.cs プロジェクト: zhonli/odata.net
        /// <summary>
        /// Builds a constant expression designed to be used in query filters. The constant is one that is likely to return results although
        /// results are not guaranteed.
        /// </summary>
        /// <param name="rootExpression">The <cref>QueryRootExpression</cref> that contains the property used to generate the constant.</param>
        /// <param name="propertyPaths">The paths to the property.</param>
        /// <returns>A constant expression matching the property's type</returns>
        public QueryConstantExpression GetConstantForProperty(QueryRootExpression rootExpression, string[] propertyPaths)
        {
            var dataRows = this.DataSet[rootExpression.Name].Elements.Cast <QueryStructuralValue>();

            IEnumerable <QueryScalarValue> propertyDataSet =
                this.GetPropertyRows(
                    dataRows,
                    propertyPaths.ToList <string>(),
                    ((QueryCollectionType <QueryStructuralType>)rootExpression.ExpressionType).ElementType);

            return(CommonQueryBuilder.Constant(this.SelectRelevantValue(propertyDataSet)));
        }
コード例 #4
0
        /// <summary>
        /// Resolves types for the specified expression.
        /// </summary>
        /// <param name="expression">The expression to resolve types for.</param>
        /// <returns>Expression with resolved types.</returns>
        public QueryExpression Visit(QueryRootExpression expression)
        {
            EntitySet entitySet = expression.UnderlyingEntitySet;

            if (entitySet != null && expression.ExpressionType.IsUnresolved)
            {
                var expressionType = this.TypeLibrary.GetQueryEntityTypeForEntitySet(entitySet).CreateCollectionType();
                return(new QueryRootExpression(entitySet, expressionType));
            }

            return(expression);
        }
コード例 #5
0
            protected override Expression VisitExtension(Expression node)
            {
                if (node is QueryRootExpression queryRootExpression)
                {
                    if (QueryRootExpression != null)
                    {
                        throw new InvalidReplaceQueryRootException("more than one query root");
                    }
                    QueryRootExpression = queryRootExpression;
                }

                return(base.VisitExtension(node));
            }
コード例 #6
0
        /// <summary>
        /// Builds root queries
        /// </summary>
        /// <param name="entityModelSchema">Entity Model Schema</param>
        /// <param name="queryTypeLibrary">Query Type Library</param>
        protected virtual void BuildRootQueriesAndTypes(EntityModelSchema entityModelSchema, QueryTypeLibrary queryTypeLibrary)
        {
            var rootQueriesList = new List <QueryExpression>();

            foreach (var container in entityModelSchema.EntityContainers)
            {
                foreach (var entitySet in container.EntitySets)
                {
                    var entityType = queryTypeLibrary.GetQueryEntityTypeForEntitySet(entitySet);
                    this.RootDataTypes.Add(entitySet.Name, entityType);
                    if (this.ShouldCreateRootQuery(entitySet))
                    {
                        QueryRootExpression rootExpression = new QueryRootExpression(entitySet.Name, entityType.CreateCollectionType());
                        rootQueriesList.Add(rootExpression);
                    }
                }
            }

            this.RootQueries = rootQueriesList;
        }
            protected Expression ExpandNavigation(
                Expression root, EntityReference entityReference, INavigation navigation, bool derivedTypeConversion)
            {
                if (entityReference.NavigationMap.TryGetValue(navigation, out var expansion))
                {
                    return(expansion);
                }

                var targetType = navigation.TargetEntityType;

                if (targetType.HasDefiningNavigation() ||
                    targetType.IsOwned())
                {
                    var ownedEntityReference = new EntityReference(targetType);
                    ownedEntityReference.MarkAsOptional();
                    if (entityReference.IncludePaths.ContainsKey(navigation))
                    {
                        ownedEntityReference.SetIncludePaths(entityReference.IncludePaths[navigation]);
                    }

                    var ownedExpansion = new OwnedNavigationReference(root, navigation, ownedEntityReference);
                    if (navigation.IsCollection)
                    {
                        var elementType = ownedExpansion.Type.TryGetSequenceType();
                        var subquery    = Expression.Call(
                            QueryableMethods.AsQueryable.MakeGenericMethod(elementType),
                            ownedExpansion);

                        return(new MaterializeCollectionNavigationExpression(subquery, navigation));
                    }

                    entityReference.NavigationMap[navigation] = ownedExpansion;
                    return(ownedExpansion);
                }

                var innerQueryable = new QueryRootExpression(targetType);
                var innerSource    = (NavigationExpansionExpression)_navigationExpandingExpressionVisitor.Visit(innerQueryable);

                if (entityReference.IncludePaths.ContainsKey(navigation))
                {
                    var innerEntityReference = (EntityReference)((NavigationTreeExpression)innerSource.PendingSelector).Value;
                    innerEntityReference.SetIncludePaths(entityReference.IncludePaths[navigation]);
                }

                var        innerSourceSequenceType = innerSource.Type.GetSequenceType();
                var        innerParameter          = Expression.Parameter(innerSourceSequenceType, "i");
                Expression outerKey;

                if (root is NavigationExpansionExpression innerNavigationExpansionExpression &&
                    innerNavigationExpansionExpression.CardinalityReducingGenericMethodInfo != null)
                {
                    // This is FirstOrDefault ending so we need to push down properties.
                    var temporaryParameter = Expression.Parameter(root.Type);
                    var temporaryKey       = temporaryParameter.CreateKeyValuesExpression(
                        navigation.IsOnDependent
                            ? navigation.ForeignKey.Properties
                            : navigation.ForeignKey.PrincipalKey.Properties,
                        makeNullable: true);
                    var newSelector = ReplacingExpressionVisitor.Replace(
                        temporaryParameter,
                        innerNavigationExpansionExpression.PendingSelector,
                        temporaryKey);
                    innerNavigationExpansionExpression.ApplySelector(newSelector);
                    outerKey = innerNavigationExpansionExpression;
                }
コード例 #8
0
ファイル: UriQueryVisitor.cs プロジェクト: larsenjo/odata.net
 /// <summary>
 /// Visits a QueryExpression tree whose root node is the LinqQueryRootExpression.
 /// </summary>
 /// <param name="expression">The root node of the expression tree being visited.</param>
 /// <returns>Uri query string representing the expression.</returns>
 public override string Visit(QueryRootExpression expression)
 {
     return expression.Name;
 }
コード例 #9
0
 /// <summary>
 /// Visits a QueryExpression tree whose root node is the QueryRootExpression.
 /// </summary>
 /// <param name="expression">The root node of the expression tree being visited.</param>
 /// <returns>Uri query string representing the expression.</returns>
 public virtual string Visit(QueryRootExpression expression)
 {
     throw new TaupoNotSupportedException("Not supported");
 }
コード例 #10
0
        /// <summary>
        /// Builds root queries
        /// </summary>
        /// <param name="entityModelSchema">Entity Model Schema</param>
        /// <param name="queryTypeLibrary">Query Type Library</param>
        protected virtual void BuildRootQueriesAndTypes(EntityModelSchema entityModelSchema, QueryTypeLibrary queryTypeLibrary)
        {
            var rootQueriesList = new List<QueryExpression>();

            foreach (var container in entityModelSchema.EntityContainers)
            {
                foreach (var entitySet in container.EntitySets)
                {
                    var entityType = queryTypeLibrary.GetQueryEntityTypeForEntitySet(entitySet);
                    this.RootDataTypes.Add(entitySet.Name, entityType);
                    if (this.ShouldCreateRootQuery(entitySet))
                    {
                        QueryRootExpression rootExpression = new QueryRootExpression(entitySet.Name, entityType.CreateCollectionType());
                        rootQueriesList.Add(rootExpression);
                    }
                }
            }

            this.RootQueries = rootQueriesList;
        }
コード例 #11
0
            public override QueryExpression Visit(QueryRootExpression expression)
            {
                var entitySetPropertyInfo = expression.GetType().GetProperties(false, false).Where(p => p.Name == "UnderlyingEntitySet").Single();
                var entitySet = (EntitySet)entitySetPropertyInfo.GetValue(expression, null);

                return CommonQueryBuilder.Root(entitySet);
            }
コード例 #12
0
 /// <summary>
 /// Generates System.CodeDom.CodeExpression from the given expression.
 /// </summary>
 /// <param name="expression">Expression from which System.CodeDom.CodeExpression is generated.</param>
 /// <returns>Generated System.CodeDom.CodeExpression.</returns>
 public virtual CodeExpression Visit(QueryRootExpression expression)
 {
     return(this.RootExpression.Property(expression.Name));
 }
コード例 #13
0
ファイル: QueryRepository.cs プロジェクト: larsenjo/odata.net
        /// <summary>
        /// Builds a constant expression designed to be used in query filters. The constant is one that is likely to return results although
        /// results are not guaranteed.
        /// </summary>
        /// <param name="rootExpression">The <cref>QueryRootExpression</cref> that contains the property used to generate the constant.</param>
        /// <param name="propertyPaths">The paths to the property.</param>
        /// <returns>A constant expression matching the property's type</returns>
        public QueryConstantExpression GetConstantForProperty(QueryRootExpression rootExpression, string[] propertyPaths)
        {
            var dataRows = this.DataSet[rootExpression.Name].Elements.Cast<QueryStructuralValue>();

            IEnumerable<QueryScalarValue> propertyDataSet = 
                this.GetPropertyRows(
                    dataRows, 
                    propertyPaths.ToList<string>(), 
                    ((QueryCollectionType<QueryStructuralType>)rootExpression.ExpressionType).ElementType);

            return CommonQueryBuilder.Constant(this.SelectRelevantValue(propertyDataSet));
        }
 private QueryRootExpressionReplaceVisitor(QueryRootExpression setQuery)
 {
     _setQuery = setQuery;
 }
コード例 #15
0
ファイル: UriQueryVisitor.cs プロジェクト: zhonli/odata.net
 /// <summary>
 /// Visits a QueryExpression tree whose root node is the LinqQueryRootExpression.
 /// </summary>
 /// <param name="expression">The root node of the expression tree being visited.</param>
 /// <returns>Uri query string representing the expression.</returns>
 public override string Visit(QueryRootExpression expression)
 {
     return(expression.Name);
 }
コード例 #16
0
 /// <summary>
 /// Replaces the given expression.
 /// </summary>
 /// <param name="expression">Expression to replace.</param>
 /// <returns>Replaced expression.</returns>
 public virtual QueryExpression Visit(QueryRootExpression expression)
 {
     return(expression);
 }
コード例 #17
0
 /// <summary>
 /// Evaluates the specified expression.
 /// </summary>
 /// <param name="expression">The expression to evaluate.</param>
 /// <returns>Value of the expression.</returns>
 public QueryValue Visit(QueryRootExpression expression)
 {
     return(this.DataSet[expression.Name]);
 }