Пример #1
0
        private static PathEdgeNonGeneric GetPathEdgeFromMemberExpression(IElementCreatorCore creator,
                                                                          Type sourceType,
                                                                          MemberExpression expression)
        {
            var nodeType     = expression.Expression.NodeType;
            var propertyName = expression.Member.Name;

            switch (nodeType)
            {
            case ExpressionType.Parameter:
            {
                var destinationType = DetermineEntityType(expression);
                return(CreatePathEdge(creator, destinationType, sourceType, propertyName));
            }

            case ExpressionType.MemberAccess:
            case ExpressionType.Call:
            {
                var pathEdge        = GetPathEdge(expression.Expression, creator, sourceType);
                var destinationType = DetermineEntityType(expression);
                var childEdge       = CreatePathEdge(creator, destinationType, pathEdge.EndNodeType, propertyName);
                pathEdge.ChildEdges.Add(childEdge);
                return(pathEdge);
            }

            case ExpressionType.Constant:
            {
                return(GetPathEdgeFromCompiledExpression(creator, sourceType, expression));
            }
            }
            throw new Exception(String.Format("Cannot Handle NodeType: {0}", nodeType));
        }
Пример #2
0
        private static PathEdgeNonGeneric GetPathEdge(Expression expression,
                                                      IElementCreatorCore creator,
                                                      Type sourceType)
        {
            expression = UnwrapUnaryExpression(expression);
            var lambdaExpression = expression as LambdaExpression;

            if (lambdaExpression != null)
            {
                expression = lambdaExpression.Body;
            }
            var methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                return(IsGenericTypeDefinition(methodCallExpression.Type, typeof(Expression <>))
                           ? GetPathEdgeFromCompiledExpression(creator, sourceType, methodCallExpression)
                           : GetPathEdgeFromMethodCallExpression(creator, sourceType, methodCallExpression));
            }
            var memberExpression = expression as MemberExpression;

            if (memberExpression != null)
            {
                return(GetPathEdgeFromMemberExpression(creator, sourceType, memberExpression));
            }

            // if it gets here then something is wrong
            throw new Exception(String.Format("Cannot handle {0}", expression.GetType().Name));
        }
Пример #3
0
        private static PathEdgeNonGeneric GetPathEdgeFromCompiledExpression(IElementCreatorCore creator,
                                                                            Type sourceType,
                                                                            Expression expression)
        {
            var resultExpression = Expression.Lambda <Func <Expression> >(expression).Compile()();

            return(GetPathEdge(resultExpression, creator, sourceType));
        }
Пример #4
0
        private static IEnumerable <IPathEdge> GetChildPathEdges(Expression expression,
                                                                 IElementCreatorCore creator,
                                                                 Type sourceType)
        {
            var expressions = GetExpressions(expression);

            return(GetPathEdges(expressions, creator, sourceType));
        }
Пример #5
0
 private static IEnumerable <IPathEdge> GetPathEdges(IEnumerable <Expression> expressions,
                                                     IElementCreatorCore creator,
                                                     Type sourceType)
 {
     return(expressions
            .Select(e => GetPathEdge(e, creator, sourceType))
            .ToArray());
 }
Пример #6
0
        private static void AddChildEdges(IElementCreatorCore creator,
                                          Expression childExpression,
                                          PathEdgeNonGeneric targetEdge)
        {
            var destinationType = targetEdge.EndNodeType;
            var pathEdges       = GetChildPathEdges(childExpression, creator, destinationType);

            targetEdge.ChildEdges.AddRange(pathEdges);
        }
Пример #7
0
        private static PathEdgeNonGeneric CreatePathEdge(IElementCreatorCore creator,
                                                         Type destinationType,
                                                         Type sourceType,
                                                         String propertyName)
        {
            var prefetchPathElement = new PathElementCreator
                                          (creator,
                                          destinationType,
                                          sourceType,
                                          propertyName)
                                      .CreatePrefetchElement();

            return(new PathEdgeNonGeneric
            {
                EndNodeType = destinationType,
                PathElement = prefetchPathElement
            });
        }
Пример #8
0
        private static void HandleIncludeExcludeFields(PathEdgeNonGeneric targetEdge,
                                                       IElementCreatorCore creator,
                                                       IEnumerable <Expression> expressions,
                                                       Boolean exclude)
        {
            var destinationType = targetEdge.EndNodeType;

            if (targetEdge.FieldsToExcludeInclude != null)
            {
                throw new Exception("There can only be one call to Exclude or Include in each part of the prefetch path.");
            }
            targetEdge.FieldsToExcludeInclude = new ExcludeIncludeFieldsList(exclude);
            var entity = LinqUtils.CreateEntityInstanceFromEntityType(destinationType, creator);
            var fields = expressions
                         .Select(e => GetExpression <LambdaExpression>(e).Body)
                         .Select(e => GetExpression <MemberExpression>(e).Member.Name)
                         .Select(name => LinqUtils.GetFieldObject(entity, name));

            targetEdge.FieldsToExcludeInclude.AddRange(fields);
        }
Пример #9
0
        private static PathEdgeNonGeneric GetPathEdgeFromMethodCallExpression(IElementCreatorCore creator,
                                                                              Type sourceType,
                                                                              MethodCallExpression expression)
        {
            var pathEdge   = GetPathEdge(expression.Arguments[0], creator, sourceType);
            var targetEdge = pathEdge;

            while (targetEdge.ChildEdges.Any())
            {
                targetEdge = (PathEdgeNonGeneric)targetEdge.ChildEdges[0];
            }

            var methodName         = expression.Method.Name;
            var argumentExpression = expression.Arguments[1];

            switch (methodName)
            {
            case "With":
            {
                AddChildEdges(creator, argumentExpression, targetEdge);
                break;
            }

            case "FilterBy":
            case "Where":
            {
                targetEdge.FilterLambda = GetExpression <LambdaExpression>(argumentExpression);
                break;
            }

            case "OrderBy":
            case "SortBy":
            {
                var sortClauseExpression = new SortClauseExpression(sourceType,
                                                                    SortOperator.Ascending,
                                                                    GetExpression <LambdaExpression>(argumentExpression));
                targetEdge.SortClauseExpressions.Add(sortClauseExpression);
                break;
            }

            case "OrderByDescending":
            case "SortByDescending":
            {
                var sortClauseExpression = new SortClauseExpression(sourceType,
                                                                    SortOperator.Descending,
                                                                    GetExpression <LambdaExpression>(argumentExpression));
                targetEdge.SortClauseExpressions.Add(sortClauseExpression);
                break;
            }

            case "LimitTo":
            case "Take":
            {
                var constantExpression = GetExpression <ConstantExpression>(argumentExpression);
                targetEdge.Limiter = (Int32)constantExpression.Value;
                break;
            }

            case "Include":
            {
                HandleIncludeExcludeFields(targetEdge,
                                           creator,
                                           GetExpression <NewArrayExpression>(argumentExpression).Expressions,
                                           false);
                break;
            }

            case "Exclude":
            {
                HandleIncludeExcludeFields(targetEdge,
                                           creator,
                                           GetExpression <NewArrayExpression>(argumentExpression).Expressions,
                                           true);
                break;
            }

            default:
                throw new Exception("Unknown method specified");
            }
            return(pathEdge);
        }