Skip to content

Commit 487bef9

Browse files
MilosMilos
authored andcommitted
Sort breaking change fixed. I have to pay more attention to public methods
1 parent d63ff38 commit 487bef9

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,19 @@ public static IOrderedQueryable<TSource> Sort<TSource>(this IQueryable<TSource>
4949
{
5050
if (sortQuery.IsAttributeOfRelationship)
5151
{
52+
// For now is created new instance, later resolve from cache
5253
var relatedAttrQuery = new RelatedAttrQuery(jsonApiContext, sortQuery);
54+
var path = relatedAttrQuery.GetRelatedPropertyPath();
5355
return sortQuery.Direction == SortDirection.Descending
54-
? source.OrderByDescending(relatedAttrQuery)
55-
: source.OrderBy(relatedAttrQuery);
56+
? source.OrderByDescending(path)
57+
: source.OrderBy(path);
5658
}
5759
else
5860
{
5961
var attrQuery = new AttrQuery(jsonApiContext, sortQuery);
6062
return sortQuery.Direction == SortDirection.Descending
61-
? source.OrderByDescending(attrQuery)
62-
: source.OrderBy(attrQuery);
63+
? source.OrderByDescending(attrQuery.Attribute.InternalAttributeName)
64+
: source.OrderBy(attrQuery.Attribute.InternalAttributeName);
6365
}
6466
}
6567

@@ -68,30 +70,31 @@ public static IOrderedQueryable<TSource> Sort<TSource>(this IOrderedQueryable<TS
6870
if (sortQuery.IsAttributeOfRelationship)
6971
{
7072
var relatedAttrQuery = new RelatedAttrQuery(jsonApiContext, sortQuery);
73+
var path = relatedAttrQuery.GetRelatedPropertyPath();
7174
return sortQuery.Direction == SortDirection.Descending
72-
? source.OrderByDescending(relatedAttrQuery)
73-
: source.OrderBy(relatedAttrQuery);
75+
? source.OrderByDescending(path)
76+
: source.OrderBy(path);
7477
}
7578
else
7679
{
7780
var attrQuery = new AttrQuery(jsonApiContext, sortQuery);
7881
return sortQuery.Direction == SortDirection.Descending
79-
? source.OrderByDescending(attrQuery)
80-
: source.OrderBy(attrQuery);
82+
? source.OrderByDescending(attrQuery.Attribute.InternalAttributeName)
83+
: source.OrderBy(attrQuery.Attribute.InternalAttributeName);
8184
}
8285
}
8386

84-
public static IOrderedQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, BaseAttrQuery baseAttrQuery)
85-
=> CallGenericOrderMethod(source, baseAttrQuery, "OrderBy");
87+
public static IOrderedQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string propertyName)
88+
=> CallGenericOrderMethod(source, propertyName, "OrderBy");
8689

87-
public static IOrderedQueryable<TSource> OrderByDescending<TSource>(this IQueryable<TSource> source, BaseAttrQuery baseAttrQuery)
88-
=> CallGenericOrderMethod(source, baseAttrQuery, "OrderByDescending");
90+
public static IOrderedQueryable<TSource> OrderByDescending<TSource>(this IQueryable<TSource> source, string propertyName)
91+
=> CallGenericOrderMethod(source, propertyName, "OrderByDescending");
8992

90-
public static IOrderedQueryable<TSource> ThenBy<TSource>(this IOrderedQueryable<TSource> source, BaseAttrQuery baseAttrQuery)
91-
=> CallGenericOrderMethod(source, baseAttrQuery, "ThenBy");
93+
public static IOrderedQueryable<TSource> ThenBy<TSource>(this IOrderedQueryable<TSource> source, string propertyName)
94+
=> CallGenericOrderMethod(source, propertyName, "ThenBy");
9295

93-
public static IOrderedQueryable<TSource> ThenByDescending<TSource>(this IOrderedQueryable<TSource> source, BaseAttrQuery baseAttrQuery)
94-
=> CallGenericOrderMethod(source, baseAttrQuery, "ThenByDescending");
96+
public static IOrderedQueryable<TSource> ThenByDescending<TSource>(this IOrderedQueryable<TSource> source, string propertyName)
97+
=> CallGenericOrderMethod(source, propertyName, "ThenByDescending");
9598

9699
public static IQueryable<TSource> Filter<TSource>(this IQueryable<TSource> source, IJsonApiContext jsonApiContext, FilterQuery filterQuery)
97100
{
@@ -206,21 +209,24 @@ public static IQueryable<T> PageForward<T>(this IQueryable<T> source, int pageSi
206209

207210
#region Generic method calls
208211

209-
private static IOrderedQueryable<TSource> CallGenericOrderMethod<TSource>(IQueryable<TSource> source, BaseAttrQuery baseAttrQuery, string method)
212+
private static IOrderedQueryable<TSource> CallGenericOrderMethod<TSource>(IQueryable<TSource> source, string propertyName, string method)
210213
{
211214
// {x}
212215
var parameter = Expression.Parameter(typeof(TSource), "x");
213216
MemberExpression member;
214-
// {x.relationship.propertyName}
215-
if (baseAttrQuery.IsAttributeOfRelationship)
217+
218+
var values = propertyName.Split('.');
219+
if (values.Length > 1)
216220
{
217-
var relation = Expression.PropertyOrField(parameter, baseAttrQuery.RelationshipAttribute.InternalRelationshipName);
218-
member = Expression.Property(relation, baseAttrQuery.Attribute.InternalAttributeName);
221+
var relation = Expression.PropertyOrField(parameter, values[0]);
222+
// {x.relationship.propertyName}
223+
member = Expression.Property(relation, values[1]);
219224
}
220-
// {x.propertyName}
221225
else
222-
member = Expression.Property(parameter, baseAttrQuery.Attribute.InternalAttributeName);
223-
226+
{
227+
// {x.propertyName}
228+
member = Expression.Property(parameter, values[0]);
229+
}
224230
// {x=>x.propertyName} or {x=>x.relationship.propertyName}
225231
var lambda = Expression.Lambda(member, parameter);
226232

src/JsonApiDotNetCore/Internal/Query/RelatedAttrQuery.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ public RelatedAttrQuery(IJsonApiContext jsonApiContext, SortQuery sortQuery)
4949
Direction = sortQuery.Direction;
5050
}
5151

52+
/// <summary>
53+
/// Get relationship and attribute connected by '.' character
54+
/// </summary>
55+
/// <example>
56+
/// "TodoItem.Owner"
57+
/// </example>
58+
/// <returns></returns>
59+
public string GetRelatedPropertyPath()
60+
{
61+
return string.Format("{0}.{1}", RelationshipAttribute.InternalRelationshipName, Attribute.InternalAttributeName);
62+
}
63+
5264
private RelationshipAttribute GetRelationshipAttribute(string relationship)
5365
{
5466
try

0 commit comments

Comments
 (0)