Skip to content

Commit e7049f7

Browse files
committed
Optimize MIN/MAX on DISTINCT EnumerableExpressions
1 parent 158fdc8 commit e7049f7

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

src/EFCore.Relational/Query/EnumerableExpression.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ public virtual EnumerableExpression ApplySelector(Expression expression)
7474
public virtual EnumerableExpression ApplyDistinct()
7575
=> new(Selector, distinct: true, Predicate, Orderings);
7676

77+
/// <summary>
78+
/// Drops DISTINCT operator on the selector of the <see cref="EnumerableExpression" />.
79+
/// </summary>
80+
/// <returns>The new expression with specified component updated.</returns>
81+
public virtual EnumerableExpression DropDistinct()
82+
=> new(Selector, distinct: false, Predicate, Orderings);
83+
7784
/// <summary>
7885
/// Applies filter predicate to the <see cref="EnumerableExpression" />.
7986
/// </summary>

src/EFCore.Relational/Query/RelationalSqlTranslatingExpressionVisitor.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,12 +1362,15 @@ protected virtual bool TryTranslateAggregateMethodCall(
13621362
{
13631363
switch (genericMethod.Name)
13641364
{
1365-
case nameof(Queryable.Average)
1366-
when QueryableMethods.IsAverageWithoutSelector(genericMethod):
13671365
case nameof(Queryable.Max)
13681366
when genericMethod == QueryableMethods.MaxWithoutSelector:
13691367
case nameof(Queryable.Min)
13701368
when genericMethod == QueryableMethods.MinWithoutSelector:
1369+
enumerableExpression = enumerableExpression.DropDistinct();
1370+
break;
1371+
1372+
case nameof(Queryable.Average)
1373+
when QueryableMethods.IsAverageWithoutSelector(genericMethod):
13711374
case nameof(Queryable.Sum)
13721375
when QueryableMethods.IsSumWithoutSelector(genericMethod):
13731376
case nameof(Queryable.Count)
@@ -1376,12 +1379,16 @@ when QueryableMethods.IsSumWithoutSelector(genericMethod):
13761379
when genericMethod == QueryableMethods.LongCountWithoutPredicate:
13771380
break;
13781381

1379-
case nameof(Queryable.Average)
1380-
when QueryableMethods.IsAverageWithSelector(genericMethod):
13811382
case nameof(Queryable.Max)
13821383
when genericMethod == QueryableMethods.MaxWithSelector:
13831384
case nameof(Queryable.Min)
13841385
when genericMethod == QueryableMethods.MinWithSelector:
1386+
enumerableExpression = enumerableExpression.DropDistinct();
1387+
enumerableExpression = ProcessSelector(enumerableExpression, arguments[1].UnwrapLambdaFromQuote());
1388+
break;
1389+
1390+
case nameof(Queryable.Average)
1391+
when QueryableMethods.IsAverageWithSelector(genericMethod):
13851392
case nameof(Queryable.Sum)
13861393
when QueryableMethods.IsSumWithSelector(genericMethod):
13871394
enumerableExpression = ProcessSelector(enumerableExpression, arguments[1].UnwrapLambdaFromQuote());

0 commit comments

Comments
 (0)