private Expression WrapWithIncludeCall(Expression expression)
            {
                var elementType = HarshQueryable
                    .ExtractElementTypes(expression.Type)
                    .FirstOrDefault();

                if (elementType == null)
                {
                    return expression;
                }

                var includeCall = IncludeMethodCallExpression.TryExtend(expression);

                if (includeCall == null)
                {
                    includeCall = new IncludeMethodCallExpression(elementType, expression);
                }

                includeCall = includeCall.Update(
                    includeCall.Object,
                    Visit(includeCall.Retrievals)
                );

                return includeCall.Reduce();
            }
示例#2
0
            private Expression WrapWithIncludeCall(Expression expression)
            {
                var elementType = HarshQueryable
                                  .ExtractElementTypes(expression.Type)
                                  .FirstOrDefault();

                if (elementType == null)
                {
                    return(expression);
                }

                var includeCall = IncludeMethodCallExpression.TryExtend(expression);

                if (includeCall == null)
                {
                    includeCall = new IncludeMethodCallExpression(elementType, expression);
                }

                includeCall = includeCall.Update(
                    includeCall.Object,
                    Visit(includeCall.Retrievals)
                    );

                return(includeCall.Reduce());
            }
            protected override Expression VisitMethodCall(MethodCallExpression node)
            {
                if (node == null)
                {
                    throw Logger.Fatal.ArgumentNull(nameof(node));
                }

                return(Logger.Method(nameof(VisitMethodCall), node).Invoke(() =>
                {
                    var includeCall = IncludeMethodCallExpression.TryExtend(node);

                    if (includeCall != null)
                    {
                        return VisitIncludeCall(includeCall);
                    }

                    return base.VisitMethodCall(node);
                }));
            }
            private Expression VisitIncludeCall(IncludeMethodCallExpression includeCall)
            {
                var retrievals = includeCall.Retrievals;
                var canRecurse = DepthLimiter.CanRecurse(includeCall.ElementType);

                using (DepthLimiter.Enter(includeCall.ElementType))
                {
                    if (canRecurse)
                    {
                        retrievals = new ReadOnlyCollection<Expression>(
                            retrievals
                            .Concat(
                                Owner.GetRetrievalsCore(includeCall.ElementType)
                            )
                            .ToArray()
                        );
                    }

                    Logger.Debug(
                        "RetrievalAppendingVisitor retrievals to include: {Retrievals}",
                        retrievals
                    );

                    if (retrievals.Any())
                    {
                        var updated = includeCall.Update(
                            Visit(includeCall.Object), 
                            Visit(retrievals)
                        );

                        return updated.Reduce();
                    }

                    return Visit(includeCall.Object);
                }
            }
            private Expression VisitIncludeCall(IncludeMethodCallExpression includeCall)
            {
                var retrievals = includeCall.Retrievals;
                var canRecurse = DepthLimiter.CanRecurse(includeCall.ElementType);

                using (DepthLimiter.Enter(includeCall.ElementType))
                {
                    if (canRecurse)
                    {
                        retrievals = new ReadOnlyCollection <Expression>(
                            retrievals
                            .Concat(
                                Owner.GetRetrievalsCore(includeCall.ElementType)
                                )
                            .ToArray()
                            );
                    }

                    Logger.Debug(
                        "RetrievalAppendingVisitor retrievals to include: {Retrievals}",
                        retrievals
                        );

                    if (retrievals.Any())
                    {
                        var updated = includeCall.Update(
                            Visit(includeCall.Object),
                            Visit(retrievals)
                            );

                        return(updated.Reduce());
                    }

                    return(Visit(includeCall.Object));
                }
            }