static ProjectionBinder()
        {
            var nameBasedBinder = new NameBasedMethodCallBinder();

            nameBasedBinder.Register(new AnyBinder(), "Any", "AnyAsync");

            nameBasedBinder.Register(new AverageBinder(), "Average", "AverageAsync");

            nameBasedBinder.Register(new CountBinder(), "Count", "CountAsync", "LongCount", "LongCountAsync");

            nameBasedBinder.Register(new DistinctBinder(), node => node.Arguments.Count == 1, "Distinct");

            nameBasedBinder.Register(new FirstBinder(), "First", "FirstAsync", "FirstOrDefault", "FirstOrDefaultAsync");

            nameBasedBinder.Register(new CorrelatedGroupByBinder(), node =>
                                     node.Arguments.Count == 2 &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[1], 1),
                                     "GroupBy");

            nameBasedBinder.Register(new GroupByWithResultSelectorBinder(), node =>
                                     node.Arguments.Count == 3 &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[1], 1) &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[2], 2),
                                     "GroupBy");

            nameBasedBinder.Register(new MaxBinder(), "Max", "MaxAsync");

            nameBasedBinder.Register(new MinBinder(), "Min", "MinAsync");

            nameBasedBinder.Register(new OfTypeBinder(), "OfType");

            nameBasedBinder.Register(new OrderByBinder(), node =>
                                     node.Arguments.Count == 2 &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[1], 1),
                                     "OrderBy", "OrderByDescending", "ThenBy", "ThenByDescending");

            nameBasedBinder.Register(new SelectBinder(), node =>
                                     node.Arguments.Count == 2 &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[1], 1),
                                     "Select");

            nameBasedBinder.Register(new SingleBinder(), "Single", "SingleAsync", "SingleOrDefault", "SingleOrDefaultAsync");

            nameBasedBinder.Register(new SkipBinder(), "Skip");

            nameBasedBinder.Register(new TakeBinder(), "Take");

            nameBasedBinder.Register(new SumBinder(), "Sum", "SumAsync");

            nameBasedBinder.Register(new WhereBinder(), node =>
                                     node.Arguments.Count == 2 &&
                                     ExtensionExpressionVisitor.IsLambda(node.Arguments[1], 1),
                                     "Where");

            __methodCallBinder = nameBasedBinder;
        }
 public CompositeMethodCallBinder(MethodInfoMethodCallBinder <TBindingContext> infoBinder, NameBasedMethodCallBinder <TBindingContext> nameBinder)
 {
     _infoBinder = Ensure.IsNotNull(infoBinder, nameof(infoBinder));
     _nameBinder = Ensure.IsNotNull(nameBinder, nameof(nameBinder));
 }