public static Expression Optimize(Expression expression, Type typeForEnums, bool simplerPartialVal = true) { expression = ObjectOperandComparisonExpander.Expand(expression); expression = EnumTypeNormalizer.Normalize(expression, typeForEnums); expression = GroupByCollator.Collate(expression); expression = AggregateSubqueryRewriter.Rewrite(expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = FunctionCoalescer.Coalesce(expression); expression = ExistsSubqueryOptimizer.Optimize(expression); expression = RedundantBinaryExpressionsRemover.Remove(expression); if (simplerPartialVal) { expression = Evaluator.PartialEval(expression, c => c.NodeType != (ExpressionType)SqlExpressionType.ConstantPlaceholder && Evaluator.CanBeEvaluatedLocally(c)); } else { expression = Evaluator.PartialEval(expression); } expression = RedundantFunctionCallRemover.Remove(expression); expression = ConditionalEliminator.Eliminate(expression); expression = SqlExpressionCollectionOperationsExpander.Expand(expression); expression = SumAggregatesDefaultValueCoalescer.Coalesce(expression); expression = OrderByRewriter.Rewrite(expression); return(expression); }
public static Expression Collate(Expression expression) { var visitor = new GroupByCollator(); return(visitor.Visit(expression)); }