I'm trying to order my IMongoqueryable collection via reflection with a property string.
Unfortunately I'm getting the message Only fields are allowed in a $sort.
private static void SetOrderBy(ref IMongoQueryable<Trade> trades, BlazorGridRequest request)
{
var prop = typeof(Trade).GetProperty(request.OrderBy);
if (request.OrderByDescending)
trades = trades.OrderByDescending(t => prop.GetValue(t));
else
trades = trades.OrderBy(t => prop.GetValue(t));
}
Can someone help me figure out, how I can get this to work? Thanks!
Thanks to dododo's comments I found the following solution:
private static void SetOrderBy(ref IMongoQueryable<Trade> trades, BlazorGridRequest request)
{
ParameterExpression pe = Expression.Parameter(typeof(Trade), "t");
MemberExpression me = Expression.Property(pe, request.OrderBy);
Expression conversion = Expression.Convert(me, typeof(object));
Expression<Func<Trade, object>> orderExpression = Expression.Lambda<Func<Trade, object>> (conversion, new[] { pe });
if (request.OrderByDescending)
trades = trades.OrderByDescending(orderExpression);
else
trades = trades.OrderBy(orderExpression);
}