public static int CountReferences(Expression node) { var visitor = new QueryReferenceCounter(node.Type); visitor.Visit(node); return(visitor._queryReferenceCount); }
protected override Expression VisitMember(MemberExpression node) { var result = (MemberExpression)base.VisitMember(node); if (QueryReferenceCounter.CountReferences(result.Expression) > 1) { return(ConditionalQueryReferenceMemberExpressionRewriter.Rewrite(result.Expression, node)); } return(result); }
protected override Expression VisitMethodCall(MethodCallExpression node) { var result = (MethodCallExpression)base.VisitMethodCall(node); var isExtension = node.Method.GetCustomAttributes <ExtensionAttribute>().Any(); var methodObject = isExtension ? node.Arguments[0] : node.Object; if (methodObject != null && QueryReferenceCounter.CountReferences(methodObject) > 1) { return(ConditionalQueryReferenceMethodCallExpressionRewriter.Rewrite(methodObject, node)); } return(result); }