Skip to content

Commit

Permalink
Add quirks for #10045
Browse files Browse the repository at this point in the history
  • Loading branch information
smitpatel committed Oct 12, 2017
1 parent 74d4438 commit cb83d65
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 38 deletions.
54 changes: 38 additions & 16 deletions src/EFCore.Relational/Query/Expressions/SelectExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -810,26 +810,48 @@ public virtual Ordering AddToOrderBy([NotNull] Ordering ordering)
Check.NotNull(ordering, nameof(ordering));

var existingOrdering
= _orderBy.Find(
o =>
{
if (_expressionEqualityComparer.Equals(o.Expression, ordering.Expression))
= AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue10045", out var enabled)
&& enabled
? _orderBy.Find(
o =>
{
return true;
if (_expressionEqualityComparer.Equals(o.Expression, ordering.Expression))
{
return true;
}

if (o.Expression is NullableExpression nullableExpression1
&& _expressionEqualityComparer
.Equals(nullableExpression1.Operand.RemoveConvert(), ordering.Expression))
{
return true;
}

return ordering.Expression is NullableExpression nullableExpression2
&& _expressionEqualityComparer
.Equals(nullableExpression2.Operand.RemoveConvert(), o.Expression);
}

if (o.Expression.RemoveConvert() is NullableExpression nullableExpression1
&& _expressionEqualityComparer
.Equals(nullableExpression1.Operand.RemoveConvert(), ordering.Expression))
)
: _orderBy.Find(
o =>
{
return true;
if (_expressionEqualityComparer.Equals(o.Expression, ordering.Expression))
{
return true;
}

if (o.Expression.RemoveConvert() is NullableExpression nullableExpression1
&& _expressionEqualityComparer
.Equals(nullableExpression1.Operand.RemoveConvert(), ordering.Expression))
{
return true;
}

return ordering.Expression.RemoveConvert() is NullableExpression nullableExpression2
&& _expressionEqualityComparer
.Equals(nullableExpression2.Operand.RemoveConvert(), o.Expression);
}

return ordering.Expression.RemoveConvert() is NullableExpression nullableExpression2
&& _expressionEqualityComparer
.Equals(nullableExpression2.Operand.RemoveConvert(), o.Expression);
}
);
);

if (existingOrdering != null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,23 +197,39 @@ var orderByClause
{
var propertyExpression = querySourceReferenceExpression.CreateEFPropertyExpression(property);

var orderingExpression = Expression.Convert(
new NullConditionalExpression(
querySourceReferenceExpression,
propertyExpression),
propertyExpression.Type);

if (!orderings.Any(
o => _expressionEqualityComparer.Equals(o.Expression, orderingExpression)
|| (o.Expression is MemberExpression memberExpression1
&& propertyExpression is MethodCallExpression methodCallExpression
&& MatchEfPropertyToMemberExpression(memberExpression1, methodCallExpression))
|| (o.Expression.RemoveConvert() is NullConditionalExpression nullConditionalExpression
&& nullConditionalExpression.AccessOperation is MemberExpression memberExpression
&& propertyExpression is MethodCallExpression methodCallExpression1
&& MatchEfPropertyToMemberExpression(memberExpression, methodCallExpression1))))
if (AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue10045", out var enabled)
&& enabled)
{
parentOrderings.Add(new Ordering(orderingExpression, OrderingDirection.Asc));
if (!orderings.Any(
o => _expressionEqualityComparer.Equals(o.Expression, propertyExpression)
|| o.Expression is MemberExpression memberExpression
&& memberExpression.Expression is QuerySourceReferenceExpression memberQuerySourceReferenceExpression
&& ReferenceEquals(memberQuerySourceReferenceExpression.ReferencedQuerySource, querySourceReferenceExpression.ReferencedQuerySource)
&& memberExpression.Member.Equals(property.PropertyInfo)))
{
parentOrderings.Add(new Ordering(propertyExpression, OrderingDirection.Asc));
}
}
else
{
var orderingExpression = Expression.Convert(
new NullConditionalExpression(
querySourceReferenceExpression,
propertyExpression),
propertyExpression.Type);

if (!orderings.Any(
o => _expressionEqualityComparer.Equals(o.Expression, orderingExpression)
|| (o.Expression is MemberExpression memberExpression1
&& propertyExpression is MethodCallExpression methodCallExpression
&& MatchEfPropertyToMemberExpression(memberExpression1, methodCallExpression))
|| (o.Expression.RemoveConvert() is NullConditionalExpression nullConditionalExpression
&& nullConditionalExpression.AccessOperation is MemberExpression memberExpression
&& propertyExpression is MethodCallExpression methodCallExpression1
&& MatchEfPropertyToMemberExpression(memberExpression, methodCallExpression1))))
{
parentOrderings.Add(new Ordering(orderingExpression, OrderingDirection.Asc));
}
}
}
}
Expand Down Expand Up @@ -525,9 +541,13 @@ in fromQueryModel.BodyClauses.OfType<OrderByClause>().ToArray())
{
int projectionIndex;
var orderingExpression = ordering.Expression;
if (ordering.Expression.RemoveConvert() is NullConditionalExpression nullConditionalExpression)
if (!(AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue10045", out var enabled)
&& enabled))
{
orderingExpression = nullConditionalExpression.AccessOperation;
if (ordering.Expression.RemoveConvert() is NullConditionalExpression nullConditionalExpression)
{
orderingExpression = nullConditionalExpression.AccessOperation;
}
}

if (orderingExpression is MemberExpression memberExpression
Expand Down Expand Up @@ -566,10 +586,21 @@ in fromQueryModel.BodyClauses.OfType<OrderByClause>().ToArray())
}
else
{
projectionIndex
= subQueryProjection
// Do NOT use orderingExpression variable here
.FindIndex(e => _expressionEqualityComparer.Equals(e.RemoveConvert(), ordering.Expression.RemoveConvert()));
if (AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue10045", out var enabled2)
&& enabled2)
{
projectionIndex
= subQueryProjection
// Do NOT use orderingExpression variable here
.FindIndex(e => _expressionEqualityComparer.Equals(e.RemoveConvert(), ordering.Expression));
}
else
{
projectionIndex
= subQueryProjection
// Do NOT use orderingExpression variable here
.FindIndex(e => _expressionEqualityComparer.Equals(e.RemoveConvert(), ordering.Expression.RemoveConvert()));
}
}

if (projectionIndex == -1)
Expand Down

0 comments on commit cb83d65

Please sign in to comment.