首页 > 解决方案 > IMongoQueryable OrderBy 动态属性名称

问题描述

我正在尝试使用属性字符串通过反射来订购我的 IMongoqueryable 集合。

不幸的是,我收到了消息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));
}

有人可以帮我弄清楚,我怎样才能让它工作?谢谢!

标签: mongodb-.net-driveriqueryable

解决方案


感谢 dododo 的评论,我找到了以下解决方案:

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);
}

推荐阅读