protected abstract ShapedQueryExpression TranslateGroupBy(
     [NotNull] ShapedQueryExpression source,
     [NotNull] LambdaExpression keySelector,
     [CanBeNull] LambdaExpression elementSelector,
     [CanBeNull] LambdaExpression resultSelector);
 protected abstract ShapedQueryExpression TranslateSingleOrDefault(ShapedQueryExpression source, LambdaExpression predicate, Type returnType, bool returnDefault);
 protected abstract ShapedQueryExpression TranslateSum(ShapedQueryExpression source, LambdaExpression selector, Type resultType);
 protected abstract ShapedQueryExpression TranslateOrderBy(ShapedQueryExpression source, LambdaExpression keySelector, bool ascending);
 protected abstract ShapedQueryExpression TranslateSelectMany(ShapedQueryExpression source, LambdaExpression collectionSelector, LambdaExpression resultSelector);
 protected abstract ShapedQueryExpression TranslateIntersect(ShapedQueryExpression source1, ShapedQueryExpression source2);
 protected abstract ShapedQueryExpression TranslateLongCount(ShapedQueryExpression source, LambdaExpression predicate);
 protected abstract ShapedQueryExpression TranslateSum(
     [NotNull] ShapedQueryExpression source, [CanBeNull] LambdaExpression selector, [NotNull] Type resultType);
 protected abstract ShapedQueryExpression TranslateTake([NotNull] ShapedQueryExpression source, [NotNull] Expression count);
 protected abstract ShapedQueryExpression TranslateSelectMany(
     [NotNull] ShapedQueryExpression source, [NotNull] LambdaExpression selector);
 protected abstract ShapedQueryExpression TranslateSingleOrDefault(
     [NotNull] ShapedQueryExpression source, [CanBeNull] LambdaExpression predicate, [NotNull] Type returnType, bool returnDefault);
 protected abstract ShapedQueryExpression TranslateOfType([NotNull] ShapedQueryExpression source, [NotNull] Type resultType);
 protected abstract ShapedQueryExpression TranslateLongCount(
     [NotNull] ShapedQueryExpression source, [CanBeNull] LambdaExpression predicate);
 protected abstract ShapedQueryExpression TranslateLeftJoin(
     [NotNull] ShapedQueryExpression outer,
     [NotNull] ShapedQueryExpression inner,
     [CanBeNull] LambdaExpression outerKeySelector,
     [CanBeNull] LambdaExpression innerKeySelector,
     [NotNull] LambdaExpression resultSelector);
 protected abstract ShapedQueryExpression TranslateExcept(ShapedQueryExpression source1, ShapedQueryExpression source2);
 protected abstract ShapedQueryExpression TranslateThenBy(
     [NotNull] ShapedQueryExpression source, [NotNull] LambdaExpression keySelector, bool ascending);
 protected abstract ShapedQueryExpression TranslateGroupBy(ShapedQueryExpression source, LambdaExpression keySelector, LambdaExpression elementSelector, LambdaExpression resultSelector);
 protected abstract ShapedQueryExpression TranslateUnion(
     [NotNull] ShapedQueryExpression source1, [NotNull] ShapedQueryExpression source2);
 protected abstract ShapedQueryExpression TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector);
 protected abstract ShapedQueryExpression TranslateWhere(
     [NotNull] ShapedQueryExpression source, [NotNull] LambdaExpression predicate);
 protected abstract ShapedQueryExpression TranslateOfType(ShapedQueryExpression source, Type resultType);
 protected abstract ShapedQueryExpression TranslateContains(ShapedQueryExpression source, Expression item);
 protected abstract ShapedQueryExpression TranslateReverse(ShapedQueryExpression source);
 protected abstract ShapedQueryExpression TranslateDefaultIfEmpty(ShapedQueryExpression source, Expression defaultValue);
 protected abstract ShapedQueryExpression TranslateSelectMany(ShapedQueryExpression source, LambdaExpression selector);
 protected abstract ShapedQueryExpression TranslateDistinct(ShapedQueryExpression source);
 protected abstract ShapedQueryExpression TranslateSkipWhile(ShapedQueryExpression source, LambdaExpression predicate);
 protected abstract ShapedQueryExpression TranslateElementAtOrDefault(ShapedQueryExpression source, Expression index, bool returnDefault);
 protected abstract ShapedQueryExpression TranslateTake(ShapedQueryExpression source, Expression count);
 protected abstract ShapedQueryExpression TranslateDefaultIfEmpty(
     [NotNull] ShapedQueryExpression source, [CanBeNull] Expression defaultValue);