예제 #1
0
        public static Db.OeBoundFunctionParameter CreateBoundFunctionParameter(OeQueryContext queryContext)
        {
            var expressionBuilder = new OeExpressionBuilder(queryContext.JoinBuilder);

            Type          sourceEntityType = queryContext.EntitySetAdapter.EntityType;
            IEdmEntitySet sourceEntitySet  = OeEdmClrHelper.GetEntitySet(queryContext.EdmModel, queryContext.EntitySetAdapter.EntitySetName);
            Expression    source           = OeEnumerableStub.CreateEnumerableStubExpression(sourceEntityType, sourceEntitySet);

            source = expressionBuilder.ApplyNavigation(source, queryContext.ParseNavigationSegments);

            IEdmEntitySet targetEntitySet = OeOperationHelper.GetEntitySet(queryContext.ODataUri.Path);

            if (sourceEntitySet != targetEntitySet)
            {
                queryContext.ODataUri.Path = new ODataPath(new EntitySetSegment(targetEntitySet));
            }

            expressionBuilder = new OeExpressionBuilder(queryContext.JoinBuilder);
            Type       targetEntityType = queryContext.EdmModel.GetClrType(targetEntitySet.EntityType());
            Expression target           = OeEnumerableStub.CreateEnumerableStubExpression(targetEntityType, targetEntitySet);

            target = expressionBuilder.ApplySelect(target, queryContext);

            var sourceQueryExpression = new OeQueryExpression(queryContext.EdmModel, sourceEntitySet, source);
            var targetQueryExpression = new OeQueryExpression(queryContext.EdmModel, targetEntitySet, target)
            {
                EntryFactory = expressionBuilder.CreateEntryFactory(targetEntitySet)
            };

            Type            boundFunctionParameterType = typeof(Db.OeBoundFunctionParameter <,>).MakeGenericType(new[] { sourceEntityType, targetEntityType });
            ConstructorInfo ctor = boundFunctionParameterType.GetConstructor(new[] { typeof(OeQueryExpression), typeof(OeQueryExpression) });

            return((Db.OeBoundFunctionParameter)ctor.Invoke(new Object[] { sourceQueryExpression, targetQueryExpression }));
        }
예제 #2
0
        public static Expression GetExpression(IEdmModel edmModel, String query, IQueryable source)
        {
            var queryExpression = new OeQueryExpression(edmModel, query);

            return(OeQueryContext.TranslateSource(edmModel, null, queryExpression._expression, e => source));
        }