Skip to content

Commit 95d6f3a

Browse files
committed
Fix Skip 0 Take 0
Fix lifting an order by
1 parent 937d188 commit 95d6f3a

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

src/EFCore.Jet/Query/Internal/JetLiftOrderByPostprocessor.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ public virtual Expression Process(Expression expression)
9797
}
9898

9999
selectExpression.ClearOrdering();
100+
var limit = selectExpression.Limit;
100101
//Keep the limit in parent expression
101-
if (selectExpression.Limit != null)
102+
if (limit != null)
102103
{
103-
var limit = selectExpression.Limit;
104104
MethodInfo? dynMethod1 = selectExpression.GetType().GetMethod("set_Limit",
105105
BindingFlags.NonPublic | BindingFlags.Instance);
106106
dynMethod1?.Invoke(selectExpression, [null]);
@@ -111,7 +111,6 @@ public virtual Expression Process(Expression expression)
111111
selectExpression.Orderings, null, null);*/
112112
selectExpression = AddAliasManager(selectExpression);
113113
selectExpression.PushdownIntoSubquery();
114-
selectExpression.ApplyLimit(limit);
115114
}
116115
else
117116
{
@@ -136,6 +135,11 @@ public virtual Expression Process(Expression expression)
136135
}
137136
}
138137

138+
if (limit != null)
139+
{
140+
selectExpression.ApplyLimit(limit);
141+
}
142+
139143
if (isscalarselect && selectExpression.Projection.Count > 1)
140144
{
141145
List<ProjectionExpression> newProjections = [selectExpression.Projection[0]];

src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class JetParameterBasedSqlProcessor(
2929
/// </summary>
3030
public override Expression Process(Expression queryExpression, ParametersCacheDecorator parametersDecorator)
3131
{
32-
var optimizedQueryExpression = new SkipTakeCollapsingExpressionVisitor(Dependencies.SqlExpressionFactory)
32+
var optimizedQueryExpression = new JetZeroLimitConverter(Dependencies.SqlExpressionFactory)
3333
.Process(queryExpression, parametersDecorator);
3434

3535
var afterBaseProcessing = base.Process(optimizedQueryExpression, parametersDecorator);

src/EFCore.Jet/Query/Internal/SkipTakeCollapsingExpressionVisitor.cs renamed to src/EFCore.Jet/Query/Internal/JetZeroLimitConverter.cs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
1+
using EntityFrameworkCore.Jet.Storage.Internal;
2+
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
23

34
namespace EntityFrameworkCore.Jet.Query.Internal;
45

@@ -14,7 +15,7 @@ namespace EntityFrameworkCore.Jet.Query.Internal;
1415
/// any release. You should only use it directly in your code with extreme caution and knowing that
1516
/// doing so can result in application failures when updating to a new Entity Framework Core release.
1617
/// </remarks>
17-
public class SkipTakeCollapsingExpressionVisitor : ExpressionVisitor
18+
public class JetZeroLimitConverter : ExpressionVisitor
1819
{
1920
private readonly ISqlExpressionFactory _sqlExpressionFactory;
2021

@@ -26,7 +27,7 @@ public class SkipTakeCollapsingExpressionVisitor : ExpressionVisitor
2627
/// any release. You should only use it directly in your code with extreme caution and knowing that
2728
/// doing so can result in application failures when updating to a new Entity Framework Core release.
2829
/// </summary>
29-
public SkipTakeCollapsingExpressionVisitor(ISqlExpressionFactory sqlExpressionFactory)
30+
public JetZeroLimitConverter(ISqlExpressionFactory sqlExpressionFactory)
3031
{
3132
_sqlExpressionFactory = sqlExpressionFactory;
3233
_parametersDecorator = null!;
@@ -59,9 +60,9 @@ protected override Expression VisitExtension(Expression extensionExpression)
5960
{
6061
var result = selectExpression.Update(
6162
selectExpression.Tables,
62-
selectExpression.GroupBy.Count > 0 ? selectExpression.Predicate : _sqlExpressionFactory.Constant(false),
63+
selectExpression.GroupBy.Count > 0 ? selectExpression.Predicate : _sqlExpressionFactory.Constant(false, JetBoolTypeMapping.Default),
6364
selectExpression.GroupBy,
64-
selectExpression.GroupBy.Count > 0 ? _sqlExpressionFactory.Constant(false) : null,
65+
selectExpression.GroupBy.Count > 0 ? _sqlExpressionFactory.Constant(false, JetBoolTypeMapping.Default) : null,
6566
selectExpression.Projection,
6667
[],
6768
limit: null,
@@ -71,23 +72,16 @@ protected override Expression VisitExtension(Expression extensionExpression)
7172

7273
bool IsZero(SqlExpression? sqlExpression)
7374
{
74-
switch (sqlExpression)
75+
return sqlExpression switch
7576
{
76-
case SqlConstantExpression { Value: int intValue }:
77-
return intValue == 0;
78-
case SqlParameterExpression parameter:
79-
return _parametersDecorator.GetAndDisableCaching()[parameter.Name] is 0;
80-
case SqlBinaryExpression { Left: SqlConstantExpression left, Right: SqlConstantExpression right }:
81-
return left.Value is int leftValue && right.Value is int rightValue && leftValue + rightValue == 0;
82-
case SqlBinaryExpression { Left: SqlParameterExpression left, Right: SqlConstantExpression right }:
83-
return _parametersDecorator.GetAndDisableCaching()[left.Name] is 0 && right.Value is int and 0;
84-
case SqlBinaryExpression { Left: SqlConstantExpression left, Right: SqlParameterExpression right }:
85-
return _parametersDecorator.GetAndDisableCaching()[right.Name] is 0 && left.Value is int and 0;
86-
case SqlBinaryExpression { Left: SqlParameterExpression left, Right: SqlParameterExpression right }:
87-
return _parametersDecorator.GetAndDisableCaching()[left.Name] is 0 && _parametersDecorator.GetAndDisableCaching()[right.Name] is 0;
88-
default:
89-
return false;
90-
}
77+
SqlConstantExpression { Value: int intValue } => intValue == 0,
78+
SqlParameterExpression parameter => _parametersDecorator.GetAndDisableCaching()[parameter.Name] is 0,
79+
SqlBinaryExpression { Left: SqlConstantExpression left, Right: SqlConstantExpression right } => left.Value is int leftValue && right.Value is int rightValue && leftValue + rightValue == 0,
80+
SqlBinaryExpression { Left: SqlParameterExpression left, Right: SqlConstantExpression right } => _parametersDecorator.GetAndDisableCaching()[left.Name] is 0 && right.Value is int and 0,
81+
SqlBinaryExpression { Left: SqlConstantExpression left, Right: SqlParameterExpression right } => _parametersDecorator.GetAndDisableCaching()[right.Name] is 0 && left.Value is int and 0,
82+
SqlBinaryExpression { Left: SqlParameterExpression left, Right: SqlParameterExpression right } => _parametersDecorator.GetAndDisableCaching()[left.Name] is 0 && _parametersDecorator.GetAndDisableCaching()[right.Name] is 0,
83+
_ => false,
84+
};
9185
}
9286
}
9387

0 commit comments

Comments
 (0)